<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="x-ua-compatible" content="ie=edge"/><meta name="referrer" content="no-referrer"/><meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"/><style data-href="/styles.fff6d4504520a9f8a61d.css">@font-face{font-display:swap;font-family:Merriweather;font-style:italic;font-weight:400;src:url(/static/merriweather-400-i-l-9a3ea56a5f449980432ace5972181ef6.woff2) format("woff2");unicode-range:U+00??,U+0131,U+0152-0153,U+02bb-02bc,U+02c6,U+02da,U+02dc,U+2000-206f,U+2074,U+20ac,U+2122,U+2191,U+2193,U+2212,U+2215,U+feff,U+fffd}@font-face{font-display:swap;font-family:Merriweather;font-style:normal;font-weight:700;src:url(/static/merriweather-700-l-e24e02bb044cb07539a3a6bd12348d14.woff2) format("woff2");unicode-range:U+00??,U+0131,U+0152-0153,U+02bb-02bc,U+02c6,U+02da,U+02dc,U+2000-206f,U+2074,U+20ac,U+2122,U+2191,U+2193,U+2212,U+2215,U+feff,U+fffd}@font-face{font-display:swap;font-family:Merriweather;font-style:italic;font-weight:700;src:url(/static/merriweather-700-i-l-ad085ede31afcc5585ff34869b1cd029.woff2) format("woff2");unicode-range:U+00??,U+0131,U+0152-0153,U+02bb-02bc,U+02c6,U+02da,U+02dc,U+2000-206f,U+2074,U+20ac,U+2122,U+2191,U+2193,U+2212,U+2215,U+feff,U+fffd}@font-face{font-display:swap;font-family:Merriweather;font-style:normal;font-weight:400;src:url(/static/merriweather-400-l-8796b7875d52e9cb9b280211e8d3f82d.woff2) format("woff2");unicode-range:U+00??,U+0131,U+0152-0153,U+02bb-02bc,U+02c6,U+02da,U+02dc,U+2000-206f,U+2074,U+20ac,U+2122,U+2191,U+2193,U+2212,U+2215,U+feff,U+fffd}@font-face{font-display:swap;font-family:Montserrat;font-style:normal;font-weight:900;src:url(/static/montserrat-900-l-5751237264c0468be0d48ad1cea75b90.woff2) format("woff2");unicode-range:U+00??,U+0131,U+0152-0153,U+02bb-02bc,U+02c6,U+02da,U+02dc,U+2000-206f,U+2074,U+20ac,U+2122,U+2191,U+2193,U+2212,U+2215,U+feff,U+fffd}body{--pink:#d33a31;background-color:var(--bg)}body.light{--bg:#fff;--header:var(--pink);--textNormal:#222;--textTitle:#222;--textLink:#d33a31;--hr:rgba(0,0,0,0.2);--inlineCode-bg:rgba(255,229,100,0.2);--inlineCode-text:#1a1a1a}body.dark{-webkit-font-smoothing:antialiased;--bg:#282c35;--header:#fff;--textNormal:hsla(0,0%,100%,0.88);--textTitle:#fff;--textLink:#fa5143;--hr:hsla(0,0%,100%,0.2);--inlineCode-bg:#373c49;--inlineCode-text:#e6e6e6}body:lang(ar) article,body:lang(fa) article{direction:rtl}body:lang(ar) .language-text,body:lang(ar) article .translations,body:lang(ar) article pre,body:lang(fa) .language-text,body:lang(fa) article .translations,body:lang(fa) article pre{direction:ltr}body:lang(ar) .language-text,body:lang(fa) .language-text{display:inline-block}body:lang(ar) blockquote,body:lang(fa) blockquote{border-left:unset;border-right:.32813rem solid rgba(0,0,0,.9);padding-right:1.42188rem;padding-left:unset;margin-left:.75rem;margin-right:-1.75rem}body:lang(fa) article,body:lang(fa) header>h1{font-family:Vazir}body:lang(ar) article,body:lang(ar) header>h1{font-family:Cairo,sans-serif}body:lang(ko) article,body:lang(ko) header{word-break:keep-all}code[class*=language-],pre[class*=language-]{color:#fff;background:none;font-family:Consolas,Menlo,Monaco,source-code-pro,Courier New,monospace;font-feature-settings:normal;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;margin-bottom:0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-ms-hyphens:none;hyphens:none}pre[class*=language-]{overflow:auto;padding:1.3125rem}pre[class*=language-]::selection{background:#27292a}pre[class*=language-]::selection,pre[class*=language-] ::selection{text-shadow:none;background:hsla(0,0%,100%,.15)}:not(pre)>code[class*=language-]{border-radius:.3em;background:var(--inlineCode-bg);color:var(--inlineCode-text);padding:.15em .2em .05em;white-space:normal}.token.attr-name{color:#addb67;font-style:italic}.token.comment{color:#809393}.token.string,.token.url{color:#addb67}.token.variable{color:#d6deeb}.token.number{color:#f78c6c}.token.builtin,.token.char,.token.constant,.token.function{color:#82aaff}.token.punctuation{color:#c792ea}.token.doctype,.token.selector{color:#c792ea;font-style:"italic"}.token.class-name{color:#ffcb8b}.token.keyword,.token.operator,.token.tag{color:#ffa7c4}.token.boolean{color:#ff5874}.token.property{color:#80cbc4}.token.namespace{color:#b2ccd6}pre[data-line]{padding:1em 0 1em 3em;position:relative}.gatsby-highlight-code-line{background-color:#022a4b;display:block;padding-right:1em;padding-left:1.25em;border-left:.25em solid #ffa7c4}.gatsby-highlight,.gatsby-highlight-code-line{margin-right:-1.3125rem;margin-left:-1.3125rem}.gatsby-highlight{margin-bottom:1.75rem;border-radius:10px;background:#011627;-webkit-overflow-scrolling:touch;overflow:auto}@media (max-width:672px){.gatsby-highlight{border-radius:0}}.gatsby-highlight pre[class*=language-]{float:left;min-width:100%}.react-toggle{touch-action:pan-x;display:inline-block;position:relative;cursor:pointer;background-color:transparent;border:0;padding:0;-webkit-touch-callout:none;-webkit-user-select:none;-ms-user-select:none;user-select:none;-webkit-tap-highlight-color:rgba(0,0,0,0);-webkit-tap-highlight-color:transparent}.react-toggle-screenreader-only{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.react-toggle-track{width:50px;height:24px;padding:0;border-radius:30px;background-color:#0f1114;transition:all .2s ease}.react-toggle-track-check{position:absolute;width:17px;height:17px;left:5px;top:0;bottom:0;margin-top:auto;margin-bottom:auto;line-height:0;opacity:0;transition:opacity .25s ease}.react-toggle--checked .react-toggle-track-check,.react-toggle-track-x{opacity:1;transition:opacity .25s ease}.react-toggle-track-x{position:absolute;width:17px;height:17px;right:5px;top:0;bottom:0;margin-top:auto;margin-bottom:auto;line-height:0}.react-toggle--checked .react-toggle-track-x{opacity:0}.react-toggle-thumb{position:absolute;top:1px;left:1px;width:22px;height:22px;border-radius:50%;background-color:#fafafa;box-sizing:border-box;transition:all .5s cubic-bezier(.23,1,.32,1) 0ms;transform:translateX(0)}.react-toggle--checked .react-toggle-thumb{transform:translateX(26px);border-color:#19ab27}.react-toggle--focus .react-toggle-thumb{box-shadow:0 0 2px 3px var(--pink)}.react-toggle:active .react-toggle-thumb{box-shadow:0 0 5px 5px var(--pink)}@font-face{font-display:swap;font-family:Merriweather;font-style:normal;font-weight:400;src:url(data:font/woff2;base64,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) format("woff2");unicode-range:U+0400-045f,U+0490-0491,U+04b0-04b1,U+2116}@font-face{font-display:swap;font-family:Montserrat;font-style:normal;font-weight:900;src:url(data:font/woff2;base64,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) format("woff2");unicode-range:U+0400-045f,U+0490-0491,U+04b0-04b1,U+2116}@font-face{font-display:swap;font-family:Merriweather;font-style:italic;font-weight:400;src:url(data:font/woff2;base64,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) format("woff2");unicode-range:U+0400-045f,U+0490-0491,U+04b0-04b1,U+2116}@font-face{font-display:swap;font-family:Merriweather;font-style:normal;font-weight:700;src:url(data:font/woff2;base64,d09GMgABAAAAACNAAA4AAAAARWQAACLoAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGoEOGyAcgW4GYACCEBEICuhM03oLgkYAATYCJAOEegQgBYRaB4x3G9I4VUaGjQMAEceDIfv/SwInYz/m4FoV3Q3pnokPk3bKLRlfAkWdgyPCoUFWZtsbuP3VuFkF0yyGpbCK/JBmm7eYB1CzM/KXgPofHyHJLM8Xh+Tbv3upjTtgwErDA8oEK2gDCscOgxANUKmWmR2e32aPUPjwMQvsRPiPL90iGGBEzp4u3O2221zZ00XV1aquKhbdqgGvYZbCict8P0xPGLvrnyzkwDXS7d65+uadm9jSAbJimLby5FlN9IEWCKfJ+t//8/77G1AAQPyizZTs3GKVCHZkW7okJX4aC5j1bk0KzBviI5cpAmy5Up+qcp3l+SQk5C+dve2uVu+A9QPIfUapqEpXSStpffKKbR8YDtjnwy9/ZPsChH2K5iM7XAFDC1SnaVMUBWGboi+ia6QXQfyxVtpjP/V7uLq2SVuzACnKyVbJeP16Y+UrAJwB59kAf+E+SwBMkb0UI1VKxza5kAhAIBGAWIEkpZC0tJKRUbKwSkXKpUp1UoNGswUSAXRLBNAnEcCARACDCqR1psxNwISSgVMgTASC+IHaDKiADAD7v9ygHaJWjfTp/Z73tTeCiJeuzmaA8609wodGFq9Do5AlaH4zaotADTW+qWgEHtcZP2AbLxtk3EFIQ6ICApdQXNP6B5UIcgTS0TNYbcKkNdZaZ70pGzxjo2dtstlztthq2jbbEUCgaGnymVnYFCtRqoyTS4UqNeq1aNWmXacuI8jEuVzmBkDWxwZ4Wh+pSmWVpo8T4P5MASUfPhHL4oDIa/1GvidkEsv7OsJ2Likln2euI7XBbV7pOaGSyOCf1ku8Tk8EkRwy0cMd0ZTN5jlxQ9//kQHk0IkZbMSzaY5X/v+oRSNafmi+jiMAH8A9wGsr9gK4I45GJAkxGTkFIRGlVMnYcOEiMLFEixEvQaIkKfJxYLggHj6BAlIqakYmCzpFlYpsk2atRkvFzG7BA4/ZKDuHMVb9+qwyaEiPXsPKOTXqEKWQFuYc4X884EehhsTfos/A+S3A1WcA1Aagao3NY7X5HjCRLVkjAoZ0U2sFoIRes62spNlCyir6gj2kSYAoJcITIdpLlNTLOQYk1phvbekSTCoiSmTlgsKY6JBxsa2vcjIW903FWS9HHjeSZ2LrY59i5gjORXSQtBLrVrsQUqLzWNWDJka07U6JHczclGbcnfABHY37ivf5WMVmgJbdkhVlUuY2rSTjG4z9qRA57jYUbnrkER2ypjXd8R5bq5SxuRKPVacOsNOZnJ6xyET+muAypQbnjiWFZSVJIE3vXzxnssywPM1ZJ2k0ezSgKFzHOqB1kt2x9WkuI4UH2708dBWEeS8lQrASeMCgFHEKJUs0INglFrwh0TGkcoT5UtKP294lbg1vzkBACpeHxVGx7MG/6kWCuYz1nWFWIgS1et1aDyUK1QUzMJAEEadMStdRUDh3PZwjB/dIpsuZ1CbqyiYcQeuMOomnfDbDYIytb561BlOJqq94XqqOjlcboL96T/WhxUaA2c0bjp+EkL9/WRfuUi36EuI4V1Zy+ZA2RFRAtaF42Xrgfv74NGtNvH400fHGlsZUjTm5ifnRDXG2/RxJOpj4HuigtUHbN5oanRGsxJ0fDI8OkwvBcoqTaMZknBftHp9e7moG3s5HcRixi0wWl+k4aG0y6+SoGp3c6sV3gLINlEUgkYxXG1aEwFhGoZ6mLYy/L4RBtZ0nbyJaCvROU6NXJIvxyLF6AkrTcBDshE+/cKWdcjk2kYAgN7ZrK44OHgIFLZ0i02sYeYVdqQein1fSHt2ZnHsYYuCTb4rnVJX654QWSeVnFL1Gxe5meAzIg0q7hP1HVHZ4vxuB4jzG2n7f9JAjEFuHJ8n9UsI7hGNzPClK7nJMbBgXDZ3oGJgju2VmE8FrZRUN9l+LdtsL2TZ48/m6P6Wqlf6lO9vX2gXvL1Rd+Uyq2S70OknqMu1fH6QzUjJkrA/mCNUSTdWda+Bv1zoX14YCCISdK8CokKeeUl5XAwaHb08u5smD0ElEKeLjFI+hTNnBPYQO6h2sHA5Tfi2nmBnOT5tTLXAamJXER1ezXWT223rtuluKTOD1l3zdwikyLf/j4WfnBW30Mbq7gYFmr44Z/KoYPXdmBF0Y7I3tG1rguP97sliIgKNjLQddAK+M0qSlC4q0rV5PAo6t1Uuq38VHtR5x/G9spx7eRKRuHVDaOfvgePzch0nJhS5osAjwqeIVJYrqyGRdOq9DmoWIrraeDrvAqu+UOHBJEwIlTfR835wfJWp1XGlN942cSDjiFc3UoyMtPFlyRTyvLb84vBme1n/2u9l7MyMmmRZ5iXZBNPxzgqZmZvO4oGHPCC6E8pyL4TJvdkXOmnrUKc9dLC51M+jMw/m5ETc0ZpFfcxjeDSVEhAanHzRjWLInKHo/OxTbYXd1oBcl69DSg4TZP8dFxY9ZvolR0dG9qX+coqCp0LPXSYzqUazPMi6P3IkPu59yJYh9AhrGtEGKU+SQLGwkr11uaTYt8evGOG326L2NNqtcxtzfwRwpij6Alt/7h5j+scd4xqWUbxM3N+TBkdfO9nRbXTI3zeCavey5HHzX2HQqaXvhMZqRcpoeVQaGgOenA2rmGmCgQR+qAKUrO1bSpHRIVnaX2T1gmjjdiLS8RVGlVpHeZevUt6rEAoFKHJU4G7M6usUZJEd4SEezQhdka65kyw9Vs1Jqjcetf1VZPTdbkYygKKBEi/WicehjPtJddxFN7ZwA1LOGJiyJJqDhqEA2imhqhtIuAfSeC1B+wcrPcNX6/DalcVNQMU4Um5MZo/QE+GpKaPFmd7RdmxQGIrLPa+iC9Dw2+KuqqlxKjbQmii9ZHFWIf3YXJSz9CzoQKzA+zFcrDnkJuts0rbYVRC+cS4WgILNw8V7a69GxURnYL5NyrSiNNYNGZxYuoN9aw1VDA+x58tbtLSC2Zaz6WVLGwM9skcvrMjDiUypXC/WLLUEqJPZEGBkuqmo3ue3/I4y2oidPwvGkgHWWuIVwW5bKYhN8CO1yzOjmMUXLAe+hsfTYhlAYx3oGCY9dopb0cUnz61S2MKUK86C76ieezY+9Lzq749N4yK1cVHWmKGFg942Jh0kJOk3PwJwddU2IShAQSgNztC3zQFtsntuwc8oQNh+CzmmmK2JymJQ5+SqO7DO8vzqlGzC7dGCYh0WjCc6bM37y7Fb4q2ZXc6L3W7r7qLAncR6oGGG3LDFf32KnnmnOKJvrYRUQwVC+Hu/0bTB3c/zwxSEce+/kB5vW5xNq4eQMTI9Boa5EjYUXMlHX4Q4D48QOn2xFjxfTtiOwqvrclhYdmkCUM6Llxed2BRzFNIY4GkYql7/304InwjZ+4BOcc4HNKS/0xZJ/McveTBQni37p+Tftvo7KzFUmd/fH4N4/WBjj/C19qbdtlp77VsZ9YFfQpR4kWUBei28IdtL5cmK6W/REsTw3LwjR94fLo/uIb66VYxT6IbbLOec17ubnLf7/pS9vDSMtdkfSmYhZctRu/Y+NNSq4q4N1SyOQiH71KQzfN1UmRIdYk8wccSfJzyP/r61GYfAYRetfr6WhsV/Dl1/J+QuM3Bhihk6fPrj7ofQLdAVd23+GTg/+35a006dOn2FXH9h3YPf2hYO7D/XuW9m7iyOYOwS8vtr52cpOGA+VSNwoKW5MT4X/M3/S394aH60t6x3QNaNB8eko0/XMoO29ZrPSVi6jlYNWh7F28+ChVCPtp+DtUIvMOKLSeZhKInxb7nuKFlAnsKh0aoUYV5kFweAR7dSd452lh/eU1KUYaL3byLT7xREbD5YkWapnpze5zpSmAs/kahPFd5dgPb9fjGaBrhkdivuj+6Ss8tepjPVETwP/J76nZT0x5Ec6Z1jpF3y2AGoR0D2jQPEM3IT+nfG3GsVTcBVqVSEwFWoQzwxPEwKzoAoBYzNmFOfjhai1kIbxoRkBIf1iwY9LSKn1bhED5+MmdF0DubPdTz9aX+pJAgszDSie330ktDOws+tILt6I6sx6GiyAhUjyGZ+zMTs3/Vm/5f2sUx5nY89UIjAAmhBwjbZ093iH+cjOkso9K88f67SenHFVya44lhbmbLtNBsfBpdnCHSbQPaNE8e3+J7ak1/ZmZZUqhmanptjtL00gsBZqkf3/H0X64kazXK0Ke/rYvQz8RLN4axOPU88b/EfuC/2TRUJubnS7JOGOMbax1p7PsbfnmDKVjEvbbrgd1fv1r9VHwpfTYl/6RRzZr8vmGPPZeRWrBC4QvLKRHPem2Ys1QWfp4t7cQC6bQuASHEYAs/5uupiBy3AzY+1HGz62oDgB1zNueL4pliBQCk3I9C/P/lKGQG9oQkDkb2cdm0BgIuPl5ExN0Jbvv5FGu0JyNNb42EJlVl5+jgIJi6pghh6xpOelqeNSlbn/mmyZK3YbzMi4EQ+YteKJEaU1YYZz0+1gYVBTUW4+7gI1zarOAvUfFTP16fjIyNwIWKGN7Jq0C8f7JPrKhlqCUzgsIdk1lfJ4Y3Db5OHeDFxjDvWcKMrM1RBdYHhyZ2TcjwkJu1gJ/08JORekPqKz/sRTHwopMBBKqKD53nlqdHIdN1r/jv0+hTBccdqfuBym5bTauI+zlmtDdpWxamxgj9QH3O1d+6Nkj9+5D5I8+zNS84TRboyG5JwiRU23H58KSTDfS6vNCdvvquL4vgHdYK1vzh1uFOub8cb9kAhS2pXjg0Ll0NpdE2XK1av4qsF1uyaG33urPbeb19mj/B99YHkqnlptLPbb+yLR6CimcxI5fHo/31uy4kccz99oSc0u65ucSrpa9H5H3ZEQgbq1r1pQmQdmDAOrw9M/Y0XuEIdfEoeJDILUXKkrnp8upCvyNo3rAlRFC6GJRGaYX4fVKk1ME2YoOxxN2XpvrXW1CXzstfIKxo3k8una5p079c0iOvdN7tTcjcPv12KR2AF159v9hi41gv2A/Qk6/pgYb6jY7p3FF4Rq8i59co/ry5XTbX7RXRFdBr+vf/pzRM/b18AeY5o4FbpsDvA5VeIWNDbaUNe2aaAn0KeJjByAdsRqR/EM5CVrxKrXqb/6dX0crlcWavRKpSqQ+DgL4J/Rg6yRD84hzmU6toI10s31HjwQ1bGN+jvqXrqbji1idXRLLYO3FHUU3E/w/iTIgPgv2c7XRk1bTSh5H1veyl6T+PGOjBoUd+BlqKV07zTzveTNOUHAcZEHspYGDM1Z9lOEp3a4GJShjtEkOfjO6BRvGx3jQjPikxpdUJZsj9VmaYJ3Qe5T35NZdkMz80VPA4q74TL0GF2FLifOxI0oqjpKl2HKT8dLXkD+aGeQnMac2GC26CtL5YwSYmWxqnmqc4lt9Lyy47HfOVnEmhk5huk1WIFOKxSzeSaliificuOzN/o6jYwlUPEZ7kCfCFv+UwSZUDwLV6NWHQJzoQl5A2twUzNtCMyHWsSqRnFwZ5wvzNCm7yY9VcL54DRVrD7RjpdFpw8hy4ZqmuXDX8okXIWiipN0JYpTcSP6sgdImY/xi5XEK1TZ09Sijhi/G3t/j/r0BdiD4g24A7U6EVgEq2nAfFUHMnw+x3WoxUKDOVCFFAcUmxCYDTWIVY/iYKSSJ83MDfvT3SgDGYP7vv2vGM/E7eg6fqgpzNxSoEbx93D48n/A2bpJlN2glClbtgpqCQobjYfjNpr8Cli/rqN5eXyFLChiQBwWMvg/smUum0XeVols/mG9vMphktVXIZvBvvhq/3RFUUJKuXXfbEFggZI+afBV/JYTLfcOCzageC6uR60GGqaFdchvIPODJP9PEg0071n1AGalW3QoDnE76vBxKC0xuQa1tIOiz9hbvrIqpCUWV84Nn1llDQm49j5bEJgOrYhVi+JA+oGX11GLHvXaVfxg/fxkiuyApQe8zvTsRW1h/su5aVBPs3ycmoPbUEe4w4XI8ENWMsi/bhwcbqtRiRt68zUBT2WkxE1QixSqGVACqxjvRU6maxR2zfxmK+CBMxeHG2vaN6zqlxHrycg72BTd+QwSea/QM+BnWOvx4ZBjPEOtsGl0MpXcxpH6Tf4/xK2o1UrDCqAZsVpQfO5oN/dl3aKZEj40VFfeNNXTH/hTPZl22v8Dh+L8YqU2GJs9TbUFyl/hfcKOUnUDHXfixeh/0dWpGrlRrpJJ5EHRJ8IBlnlwosHVtr6zm64iOT+6Ps3T0T1YHoV0HhfqEKsKxbNxM/ov6z8DA+ZAHePnEU0bU60wKtQyibwwBhQG1xlmNCi7Za7UcLCto/TIoZLWFAnNvqOVesUZPPrvxkRb45Tb6iRqcSKFsqpqyZrm5ZHYaCTSl4Hw9kH923o0v2VXme5ge6f90N7itmQBvS+G7Uk9WEKJa/3+1xRb7TRhKpVSkkRBup1bzamxkcyaQkA8CN7a7AxJ0ZfEpzgt6+QIjIBCpFrso/wg1TD2sx2BTXCI5tyFhK8Y0e/mke90zOV9SCLYQ7Vv26izLS5dO9RnOj3tdM4vXyStbPY0TZRGjUOqn4Z0XI/+teUPT/vi0s7CJZPOvHf3DtOMHmjxjUnFYdog0fceBzDu0yulkTK2RS/xVjXJ29aVPhuTTX/iO4vrUKuFhokwO+1P94bVMSIprjdKjWJ+dBK4s6UmKGa4c3B1C36gq1gXfP40WVCdKOY/s6GBUyJTDv/RR+ft4K2nl04jYYifk0XKd8aQlWNIFJj7DH/7YlFXyehiIwLbYB2yOFLSftO2AY/DpeiqX0LFYeL2XzQoDv5IqA16JAB9vtxtFpMb8ZhFCV5d3tms3Lj459ifmWv/8taA218dH+YSoArZcUoYbPn7zrsduNkCeDy/bf+wxrhhobjRPWfCbyD7JfcdJ0a0mom5wnb3lPCTzINWRrJe8YnTOttE+//PrM/Vllmeaab9Dz46tKgjrg39o4EyfKMym9NZs3rNpsnlVaPrr18f1u+9MdyRYP7xHf0bcs9ais8fZ57x352pTOFnDg8qAwwfJICvU2WkhMkqAZ6RK9Cp3DXyHOuYYzEyE+yO7IBC2pwQxfrf+VyWHOeGs1uPaiVuJD/NTzk5T8S2m+CHZPLbxtDptZQDY1RYAlXUBQWDC9655fbhJ6Q9k8jqKxGZV9Ch2XsWdHjTD9epMwK3OxqKI+c4Foo7dynv1s0SFEvErOiKbeSn2Dvb3943wwYZH0ZDDW7Z+uIO3ubwhw9ZolQ+U3DNgsAUqESu/8DcKlCuHpPwzbydL+6xaLmqtjVH1ShGxBRo83LligDF/GlydKWyZVmRexr06dcA6EOVgTcTOpolgmQoEUncFRK2adgxoq7x/w4ZM3lrrmhZsD+1ohoczz0JFNOfWZITXsyOZW9E9fZdQJmMqdE0tuLGA38hivljInRBSoUsqKRmc4zX7gQK3KE/lFAXRCgG3orBtKmSsy/u520Ou/p9hCBdxCy4bqDC2IoKplfKm9X6UVCjk0fAR+nMFxof+aUEnaXYK5NC4ioCTnfZUSwMWhlzRipMhWrq0vYsoEiuSQorDi4uTwrCilHRvJwK46CKymJ5b0ha3yqq65WkrmWsi40xU+BfUEUVzpegGJAlY3J0+ZtlOYqFYWJ0QUKFTKikXvzmooIKI6CUuiAl0N7XpwidFyEwEIqRPa/uESDQD4qQeQmKAVcy9WNr+FwdZf84ArfCUWR/CyVszkr5GBjpVp6TwxkoLcLX9WnM/m99RtRVK+m5p/0fHyK0Rpl4rh0NBet6H4nAAzeZ7UaUm8bVoe1EF3ItM4irbO+uFtXlhQxenNi43RC4Ry0V4sbX3qqLk2D7h33/xFY6yrrMjRjANmBST/HFlMjR0BdEKOaDCdB5IQIToA1ZADep3of1apb3dlUoFCILIjoWjEnpK68tS1DMD/tnuRaI9d9z5cqKFAc8KStXV2QoFoJJ0QUtjXuGq6TNyxkYwB8h3se0an+697ZixYbzE95qZ5arwAGy565wU2jATvY/kI/MCzuaTIKuvL4iVg7xkeh1/RtgGvnHW5vMhpJ+eydDQnqFNcXV0BaUdJgGC+mbQ8PjB1taunL1r4P9Rv31tiar4ezPqIjEEpAYF+AqZF8XKXBFDz5/meegb4oPDxtuylsPNeBVgJvjJaIB7LFc5ghXS5tXM7AUnulTV8Mb8OvQjPpgeixEdGj/6WP/wZaW7oK3gNTIaa83mEobbR00EYklJXnsgKrAmmo88oWmx6ToO1J8ZeCpLgcOfwRmgz0y+5uxo3hM302wQc5HojtrjaaSTlsnKiMJyVHrMX+zSz9eVEXSbGGYAl35cUUZbf/tLwahWQXTbOwYHo+9BO741kTwJ8bnpiyakXGpLq3Wq444pvcRH87CJC5S6Wtk/atutOurM98L1IiJNUCY0OydphsSKsZKivhjPVIdvzriDVKN2F/VljROu36fbLjvRnKIy7nZ97yEejAKiB/WpGMFkrRQp/7bP6A7XPttzi1VDIsfNi55A5JgIUPL02qUaN4Ff9Jz4Llh3nCuuxWMbtK0dOWLB9fsWONUjg/wVb2TU24Dved0CIyHcmReimKRmApd7nt0gVPT2s3u5eWza9u6c7p5IPbBtv/j3b57YN9kGPutgguPeKYC45hlJFVCGgvrhSL6vAyBUVCDbGtQhKTlC5PZ+VyxQHDjTUD8qD6FAyXJEWWGxMG6dRXERVcmbAvYMhRaXRiuwrLZ/AzxLUiEa32LOEVaFT3vkj/xuS09nO5EtzoQl4wZ0D7RW3cHhHoU+xrjo4dX9hYcPFyOclQcG3r4MH8ZXFm5jAF8PKerVVZYtarSJeZXfEJU0e0VdouprT+P275+YELOrM81m2CmPDsvRyfYXUOqERVYc9JEinIXT329HpwGxRH7/9ieUGlXQoHaYkySxT4bxdyTEe7sCzbpu3O7WILmarUkOUMgSb32gTM2cmtC6NW1AUbdenDvatpm5MXES/rotLL+iXUm8ZpJXUneT1IP/Z/TO2c25NsC54kbpdFVby59H8JX1fXWCCvyIpQf1IJMQgxHVVa958UdvOfS/un5+WnCCAGTf7Q4VXUo1LZOHtVspGW5YkaB5p3zJ+7+sLI53SUJmBp+gmTBszpfUVtXmV1vr+F7l+uyE/XpMn7HaolL7AgSUi5IEzZdidbbSwwFgkJheYcqdlpqVPO5Ak5MyqhPgxmcA2UkASMt8u2w0EVXVqbTUN4eEs45gBJ4TgUnE0ttEXrkn0aJg9/kUwH6NGf32zF3X1XQOG4cPdrfdTSpBlJhQtuTIruP5AvoBndskyF8DkB58s1vp7hUroBu92LWhlTbfL7mvs1NvvAteIOt+fKLZaFH/lmUNPjZTUiCNZe+uHherISFcM5BFFDdW9I5PHFKeJnRb9esfjlvKaM4/IxGBu1b7juLNB5PmUVXfsDDe7tT7k/fgLuu+Wl5rr729Dam+2vFHN81IT6AO0I2yXqjm9NT854GeNQn59jl1T3ePNr/cDUmLZ4TvsNVxfGa4xxBCU3WnNvc6Ox1LUc4R1FCk6WuXsDy7HKZSNEU2SngFAfnK512I49T3pavc66qbwxS+zuiOR/4TmBi6neY6K2UsBNaF1hySoLZTJ8ls5ocPmdx//jsVjrrYqWGz++8ngqToAKZVqJ5l/2Juz84+xX87SvHSDGhwqs5xJclShQFVEfbR6rNmr5BXLZmeHtvXftokTfRGCqWpY3/S/9xfcvHYrSYlI5VVrjYfVg+Vl3tzO/iAq6B2DXeZhC1teYLa3tGWgyijhZMyD6xy8bgfRh0K28I/FPM4FF5FsZsf+zbeT2Mcjrmjdno2Kaf0xwVFZllWa4Lt6vf/Oiq5iqYXcNhxrXERScy47VJj7Dw98e6NAkQp8wFWsWXFvX+hyEEUHJ4/8NCdc/6jiVAMyVywmOb4whR+RGx84mEj7hh1Ws2OiEibi4JEKIT65XPl+GTW6eBm69gdGslHlAuTQX+Ik1y0ptpaReSkr3K3Hz09U5nSZNLRykD/r6vp8ftyEhfG+fTiJTTlA06Z2mjXkFzVUYggAxesJt0EyvXYKGc64RCKFefLzmBOZK461IOGFzkpJ0ih9Rx+guhEpQwiDv3vIE8LlrnXoR4cIRGkF3mPCA07r0VW456HMwWGRC4b0azuzeYqfgG7CKluy6m0+AiA7ZLDjHgoFRAcEZ8cBi6aQjz+HUeSkgI96MR/112OcoDiL2OvzChkZqp9Bsc+EJxoL37+e7127b7LX8y3gLY75Hcna8N968s5TsVEFW/ZgBkJJ/Xtf3aqV80Bjq5X1fv8MR8CKT7/RuLpn4HYcP1/ppL+cEIyGi+pfYHteV7/kEn83l30HS/zkIPK51N3KGFX80wTZlxe7/YVlwNMDtyYGzyxR6lftshMWkSkUtqSYOnjZcM5P5qyKC5DJyKZdnQ9YgVjSx49QlOtb8sJdKkqP9gUtaVFFlvyY8mH/tA8Ttpw4ZItXb8/ryMIpKSMJGpak0dHcQU6veGg2Dt0sZ/TavMg/+oFNIXCF+CmnGyooiAD4H53rw6LA5TkgAB/Xts/YPvX9Bl1RZyf7RP7WRlfbt4XeTqfp8bhnlOeJ4V1yLJNSOt1uzP/Sed+IY60xLiwMktfh6yiHmiQgGsxIkph4QzU8mW+qt+uqRmQGgoICslSETe/iI/tVdYHymj0GzyHH75TdAfA3+i2KmbcNokEfbJY5PkTwosFBvF090J4jFRzBSSE/v3U3enoeKb8SmHlC1y2oEm/U5n0a5NtkbY5EkYFASPTrxOs84Jz5K0miHcTe/BZ4WMsu8Sa18IzdT+0BTAIP7FI02K0H9lCmHZLj0UEJvNVH8aZSOKTRh09iv9OJqU30wBllbVh0zaikj82tRmmVfM7HYIK+uEqa67p8TaccXbkYlPLfpfg/5bSn1skTIx+ULVu0R3PTLpLVO753sJia9431Ttt09rVjBIxyVmUWB2IhP799/UKggFJKZSTL8OiJnCM4z5tKkuvrEiEa/r54BY/1IMAxcx+6arGFJlNM/3d/I+Li5O0Qd6ENgC+t1dtuo9FhgeAgCOWFBAJTdABDmkpgAfzzYhU7Z0AlQjAQIZAaBoALwfRgBBRTuMCKiEqMNIIL+SDiODqCo/zA2E1GrT/Q7mwx4gp677fl877tuxOjVqdWLJkiFTHhbzCVeZmp63082eOeXSue2gdiz61hb1xivEUgJdFNxidgSeIG9TnVp14EqXrkbdjcJky6WpCNkm6SS7XJVmJqHWBnXZ+Uvvc8pEKVh6pLSyGG94x9ZstyqVcpBUi+Ywi5ZLkwbnL6pS5PylVd9vQi0aVcqSJkOGLBgTMxEWTMBJrRaPWs4iVtSh4S1g9bKEkplljTLVoSJrbdW58jR5qUZp9jRr3oZ1pNSJ8R7aM7Lc9xwB9b3lq44RK06CZClS0fxLz5aHDSMmJaf2OvjRMzKxcig+JAJ5KTDBAhsccIECAw4CJHjgB2EUJ2mWF2WFqm5a7U631x8MR+PJdDZfLFfrzXa3PxxP58v1dn88XwKhSCyRyuQKpUqt0er0BqPJbLEW2orsjuKS0jKnq7yisqq6prauvqGxqbmlta29o7Oru6e3r39g1eDQ8Mjo2PjqiUm4NaO1qNWUrua6DCXUQMCiAJziARWtFmCi4HaAmLVUcMWuxYFhTQb2gvgSjBoImGEVN8EKYBDgkAwTkw0H2gAHPAwz0531Yd8MHAISRtxafiJnBj/bRv8/WZQRyoxNmXGZpmcJQQ0ELAqYUwQUzAYwALcDIO3igWt3E449wICBvSC+hKIGAmZYxU2oAhgEOCTDxGTDgTbAMR6GmenO+rBvBg4BCSNurT7mO5HqhI2mnMipnMuFXMrUWdg9K2m5kbsy76yU5ULO5VKu5I5cy2y1UMxktHUii1LJLQX5/XPoxVX/qXgOcVV0dS5tdDv9J8Zdj536R52DQQ+9vL2KcvWKPq9bbQcA) format("woff2");unicode-range:U+0400-045f,U+0490-0491,U+04b0-04b1,U+2116}@font-face{font-display:swap;font-family:Merriweather;font-style:italic;font-weight:700;src:url(data:font/woff2;base64,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) format("woff2");unicode-range:U+0400-045f,U+0490-0491,U+04b0-04b1,U+2116}@font-face{font-display:swap;font-family:Merriweather;font-style:normal;font-weight:400;src:url(/static/merriweather-400-l-ext-d5288db1f4ec27ce901f2212cafe210f.woff2) format("woff2");unicode-range:U+0100-024f,U+0259,U+1e??,U+2020,U+20a0-20ab,U+20ad-20cf,U+2113,U+2c60-2c7f,U+a720-a7ff}@font-face{font-display:swap;font-family:Montserrat;font-style:normal;font-weight:900;src:url(/static/montserrat-900-l-ext-fbc5aaf67a962c10c63b5e19855c1ed8.woff2) format("woff2");unicode-range:U+0100-024f,U+0259,U+1e??,U+2020,U+20a0-20ab,U+20ad-20cf,U+2113,U+2c60-2c7f,U+a720-a7ff}@font-face{font-display:swap;font-family:Merriweather;font-style:italic;font-weight:400;src:url(/static/merriweather-400-i-l-ext-e666f6219759be75786b4b439712c662.woff2) format("woff2");unicode-range:U+0100-024f,U+0259,U+1e??,U+2020,U+20a0-20ab,U+20ad-20cf,U+2113,U+2c60-2c7f,U+a720-a7ff}@font-face{font-display:swap;font-family:Merriweather;font-style:normal;font-weight:700;src:url(/static/merriweather-700-l-ext-d837d6db694644f9f86ed9dce78ac4d4.woff2) format("woff2");unicode-range:U+0100-024f,U+0259,U+1e??,U+2020,U+20a0-20ab,U+20ad-20cf,U+2113,U+2c60-2c7f,U+a720-a7ff}@font-face{font-display:swap;font-family:Merriweather;font-style:italic;font-weight:700;src:url(/static/merriweather-700-i-l-ext-1accbbf7fd1d071386c25c6e60ceca35.woff2) format("woff2");unicode-range:U+0100-024f,U+0259,U+1e??,U+2020,U+20a0-20ab,U+20ad-20cf,U+2113,U+2c60-2c7f,U+a720-a7ff}@font-face{font-display:swap;font-family:Merriweather;font-style:normal;font-weight:400;src:url(data:font/woff2;base64,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) format("woff2");unicode-range:U+0102-0103,U+0110-0111,U+1ea0-1ef9,U+20ab}@font-face{font-display:swap;font-family:Montserrat;font-style:normal;font-weight:900;src:url(data:font/woff2;base64,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) format("woff2");unicode-range:U+0102-0103,U+0110-0111,U+1ea0-1ef9,U+20ab}@font-face{font-display:swap;font-family:Merriweather;font-style:italic;font-weight:400;src:url(data:font/woff2;base64,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) format("woff2");unicode-range:U+0102-0103,U+0110-0111,U+1ea0-1ef9,U+20ab}@font-face{font-display:swap;font-family:Merriweather;font-style:normal;font-weight:700;src:url(data:font/woff2;base64,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) format("woff2");unicode-range:U+0102-0103,U+0110-0111,U+1ea0-1ef9,U+20ab}@font-face{font-display:swap;font-family:Merriweather;font-style:italic;font-weight:700;src:url(data:font/woff2;base64,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) format("woff2");unicode-range:U+0102-0103,U+0110-0111,U+1ea0-1ef9,U+20ab}@font-face{font-family:Vazir;src:url(/static/Vazir-7e0ee3222e08c9447160bcf49bb99480.eot);src:url(/static/Vazir-7e0ee3222e08c9447160bcf49bb99480.eot?#iefix) format("embedded-opentype"),url(/static/Vazir-b3f557821fa15e8cdb54f95cc8883b29.woff2) format("woff2"),url(/static/Vazir-f565dac7b6afbd13acac45b595a818ef.woff) format("woff"),url(/static/Vazir-7fca9deb357c30453f566c0ffcb7e801.ttf) format("truetype");font-weight:400;font-style:normal}@font-face{font-family:Vazir;src:url(/static/Vazir-Bold-270d17fedce27e02130f092c0b4ba7de.eot);src:url(/static/Vazir-Bold-270d17fedce27e02130f092c0b4ba7de.eot?#iefix) format("embedded-opentype"),url(/static/Vazir-Bold-679f50e43d52295a7d02b93ee2fc2df2.woff2) format("woff2"),url(/static/Vazir-Bold-ef0b757921d7805be30761a233705759.woff) format("woff"),url(/static/Vazir-Bold-5407a939b2b58fdd8df7d16ad4db2dd9.ttf) format("truetype");font-weight:700;font-style:normal}@font-face{font-family:Cairo;src:url(/static/Cairo-Regular-c1c78f6fa9dd532122e27334db485b66.ttf) format("truetype");font-weight:400;font-style:normal}@font-face{font-family:Cairo;src:url(/static/Cairo-Bold-b4db1516228507b14e63c72cc1b5fbe4.ttf) format("truetype");font-weight:700;font-style:normal}</style><meta name="generator" content="Gatsby 2.24.53"/><style type="text/css">
    .anchor {
      float: left;
      padding-right: 4px;
      margin-left: -20px;
    }
    h1 .anchor svg,
    h2 .anchor svg,
    h3 .anchor svg,
    h4 .anchor svg,
    h5 .anchor svg,
    h6 .anchor svg {
      visibility: hidden;
    }
    h1:hover .anchor svg,
    h2:hover .anchor svg,
    h3:hover .anchor svg,
    h4:hover .anchor svg,
    h5:hover .anchor svg,
    h6:hover .anchor svg,
    h1 .anchor:focus svg,
    h2 .anchor:focus svg,
    h3 .anchor:focus svg,
    h4 .anchor:focus svg,
    h5 .anchor:focus svg,
    h6 .anchor:focus svg {
      visibility: visible;
    }
  </style><script>
    document.addEventListener("DOMContentLoaded", function(event) {
      var hash = window.decodeURI(location.hash.replace('#', ''))
      if (hash !== '') {
        var element = document.getElementById(hash)
        if (element) {
          var offset = element.offsetTop
          // Wait for the browser to finish rendering before scrolling.
          setTimeout((function() {
            window.scrollTo(0, offset - 0)
          }), 0)
        }
      }
    })
  </script><link rel="preconnect" href="https://www.google-analytics.com"/><link rel="dns-prefetch" href="https://www.google-analytics.com"/><link rel="alternate" type="application/rss+xml" title="Dan Abramov&#x27;s Overreacted Blog RSS Feed" href="/rss.xml"/><link rel="icon" href="/favicon-32x32.png?v=8c19a894ebc3f54d282a8f2418cf5398" type="image/png"/><link rel="manifest" href="/manifest.webmanifest"/><link rel="apple-touch-icon" sizes="48x48" href="/icons/icon-48x48.png?v=8c19a894ebc3f54d282a8f2418cf5398"/><link rel="apple-touch-icon" sizes="72x72" href="/icons/icon-72x72.png?v=8c19a894ebc3f54d282a8f2418cf5398"/><link rel="apple-touch-icon" sizes="96x96" href="/icons/icon-96x96.png?v=8c19a894ebc3f54d282a8f2418cf5398"/><link rel="apple-touch-icon" sizes="144x144" href="/icons/icon-144x144.png?v=8c19a894ebc3f54d282a8f2418cf5398"/><link rel="apple-touch-icon" sizes="192x192" href="/icons/icon-192x192.png?v=8c19a894ebc3f54d282a8f2418cf5398"/><link rel="apple-touch-icon" sizes="256x256" href="/icons/icon-256x256.png?v=8c19a894ebc3f54d282a8f2418cf5398"/><link rel="apple-touch-icon" sizes="384x384" href="/icons/icon-384x384.png?v=8c19a894ebc3f54d282a8f2418cf5398"/><link rel="apple-touch-icon" sizes="512x512" href="/icons/icon-512x512.png?v=8c19a894ebc3f54d282a8f2418cf5398"/><title data-react-helmet="true">cube-ui源码学习 swipe组件 — ssh的博客</title><meta data-react-helmet="true" name="theme-color" content="#282c35"/><meta data-react-helmet="true" name="description" content="Personal blog by ssh. I explain with words and code."/><meta data-react-helmet="true" property="og:url" content="https://github.com/sl1673495/381488634/"/><meta data-react-helmet="true" property="og:title" content="cube-ui源码学习 swipe组件"/><meta data-react-helmet="true" property="og:description" content="Personal blog by ssh. I explain with words and code."/><meta data-react-helmet="true" name="twitter:card" content="summary"/><meta data-react-helmet="true" name="twitter:creator" content=""/><meta data-react-helmet="true" name="twitter:title" content="cube-ui源码学习 swipe组件"/><meta data-react-helmet="true" name="twitter:description" content="Personal blog by ssh. I explain with words and code."/><style id="typography.js">html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block}audio:not([controls]){display:none;height:0}progress{vertical-align:baseline}[hidden],template{display:none}a{background-color:transparent;-webkit-text-decoration-skip:objects}a:active,a:hover{outline-width:0}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:inherit;font-weight:bolder}dfn{font-style:italic}h1{font-size:2em;margin:.67em 0}mark{background-color:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}svg:not(:root){overflow:hidden}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}figure{margin:1em 40px}hr{box-sizing:content-box;height:0;overflow:visible}button,input,optgroup,select,textarea{font:inherit;margin:0}optgroup{font-weight:700}button,input{overflow:visible}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-input-placeholder{color:inherit;opacity:.54}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}html{font:100%/1.75 'Merriweather','Georgia',serif;box-sizing:border-box;overflow-y:scroll;}*{box-sizing:inherit;}*:before{box-sizing:inherit;}*:after{box-sizing:inherit;}body{color:hsla(0,0%,0%,0.9);font-family:'Merriweather','Georgia',serif;font-weight:400;word-wrap:break-word;font-kerning:normal;-moz-font-feature-settings:"kern", "liga", "clig", "calt";-ms-font-feature-settings:"kern", "liga", "clig", "calt";-webkit-font-feature-settings:"kern", "liga", "clig", "calt";font-feature-settings:"kern", "liga", "clig", "calt";}img{max-width:100%;margin-left:0;margin-right:0;margin-top:0;padding-bottom:0;padding-left:0;padding-right:0;padding-top:0;margin-bottom:1.75rem;}h1{margin-left:0;margin-right:0;margin-top:0;padding-bottom:0;padding-left:0;padding-right:0;padding-top:0;margin-bottom:1.75rem;color:inherit;font-family:Montserrat,sans-serif;font-weight:900;text-rendering:optimizeLegibility;font-size:2.5rem;line-height:1.1;}h2{margin-left:0;margin-right:0;margin-top:0;padding-bottom:0;padding-left:0;padding-right:0;padding-top:0;margin-bottom:1.75rem;color:inherit;font-family:'Merriweather','Georgia',serif;font-weight:900;text-rendering:optimizeLegibility;font-size:1.73286rem;line-height:1.1;}h3{margin-left:0;margin-right:0;margin-top:0;padding-bottom:0;padding-left:0;padding-right:0;padding-top:0;margin-bottom:1.75rem;color:inherit;font-family:'Merriweather','Georgia',serif;font-weight:900;text-rendering:optimizeLegibility;font-size:1.4427rem;line-height:1.1;}h4{margin-left:0;margin-right:0;margin-top:0;padding-bottom:0;padding-left:0;padding-right:0;padding-top:0;margin-bottom:1.75rem;color:inherit;font-family:'Merriweather','Georgia',serif;font-weight:900;text-rendering:optimizeLegibility;font-size:1rem;line-height:1.1;letter-spacing:0.140625em;text-transform:uppercase;}h5{margin-left:0;margin-right:0;margin-top:0;padding-bottom:0;padding-left:0;padding-right:0;padding-top:0;margin-bottom:1.75rem;color:inherit;font-family:'Merriweather','Georgia',serif;font-weight:900;text-rendering:optimizeLegibility;font-size:0.83255rem;line-height:1.1;}h6{margin-left:0;margin-right:0;margin-top:0;padding-bottom:0;padding-left:0;padding-right:0;padding-top:0;margin-bottom:1.75rem;color:inherit;font-family:'Merriweather','Georgia',serif;font-weight:900;text-rendering:optimizeLegibility;font-size:0.75966rem;line-height:1.1;font-style:italic;}hgroup{margin-left:0;margin-right:0;margin-top:0;padding-bottom:0;padding-left:0;padding-right:0;padding-top:0;margin-bottom:1.75rem;}ul{margin-left:1.75rem;margin-right:0;margin-top:0;padding-bottom:0;padding-left:0;padding-right:0;padding-top:0;margin-bottom:1.75rem;list-style-position:outside;list-style-image:none;list-style:disc;}ol{margin-left:1.75rem;margin-right:0;margin-top:0;padding-bottom:0;padding-left:0;padding-right:0;padding-top:0;margin-bottom:1.75rem;list-style-position:outside;list-style-image:none;}dl{margin-left:0;margin-right:0;margin-top:0;padding-bottom:0;padding-left:0;padding-right:0;padding-top:0;margin-bottom:1.75rem;}dd{margin-left:0;margin-right:0;margin-top:0;padding-bottom:0;padding-left:0;padding-right:0;padding-top:0;margin-bottom:1.75rem;}p{margin-left:0;margin-right:0;margin-top:0;padding-bottom:0;padding-left:0;padding-right:0;padding-top:0;margin-bottom:1.75rem;}figure{margin-left:0;margin-right:0;margin-top:0;padding-bottom:0;padding-left:0;padding-right:0;padding-top:0;margin-bottom:1.75rem;}pre{margin-left:0;margin-right:0;margin-top:0;padding-bottom:0;padding-left:0;padding-right:0;padding-top:0;margin-bottom:1.75rem;font-size:0.85rem;line-height:1.75rem;}table{margin-left:0;margin-right:0;margin-top:0;padding-bottom:0;padding-left:0;padding-right:0;padding-top:0;margin-bottom:1.75rem;font-size:1rem;line-height:1.75rem;border-collapse:collapse;width:100%;}fieldset{margin-left:0;margin-right:0;margin-top:0;padding-bottom:0;padding-left:0;padding-right:0;padding-top:0;margin-bottom:1.75rem;}blockquote{margin-left:-1.75rem;margin-right:1.75rem;margin-top:0;padding-bottom:0;padding-left:1.42188rem;padding-right:0;padding-top:0;margin-bottom:1.75rem;font-size:1.20112rem;line-height:1.75rem;color:inherit;font-style:italic;border-left:0.32813rem solid hsla(0,0%,0%,0.9);border-left-color:inherit;opacity:0.8;}form{margin-left:0;margin-right:0;margin-top:0;padding-bottom:0;padding-left:0;padding-right:0;padding-top:0;margin-bottom:1.75rem;}noscript{margin-left:0;margin-right:0;margin-top:0;padding-bottom:0;padding-left:0;padding-right:0;padding-top:0;margin-bottom:1.75rem;}iframe{margin-left:0;margin-right:0;margin-top:0;padding-bottom:0;padding-left:0;padding-right:0;padding-top:0;margin-bottom:1.75rem;}hr{margin-left:0;margin-right:0;margin-top:0;padding-bottom:0;padding-left:0;padding-right:0;padding-top:0;margin-bottom:calc(1.75rem - 1px);background:var(--hr);border:none;height:1px;}address{margin-left:0;margin-right:0;margin-top:0;padding-bottom:0;padding-left:0;padding-right:0;padding-top:0;margin-bottom:1.75rem;}b{font-weight:700;}strong{font-weight:700;}dt{font-weight:700;}th{font-weight:700;}li{margin-bottom:calc(1.75rem / 2);}ol li{padding-left:0;}ul li{padding-left:0;}li > ol{margin-left:1.75rem;margin-bottom:calc(1.75rem / 2);margin-top:calc(1.75rem / 2);}li > ul{margin-left:1.75rem;margin-bottom:calc(1.75rem / 2);margin-top:calc(1.75rem / 2);}blockquote *:last-child{margin-bottom:0;}li *:last-child{margin-bottom:0;}p *:last-child{margin-bottom:0;}li > p{margin-bottom:calc(1.75rem / 2);}code{font-size:0.85rem;line-height:1.75rem;}kbd{font-size:0.85rem;line-height:1.75rem;}samp{font-size:0.85rem;line-height:1.75rem;}abbr{border-bottom:1px dotted hsla(0,0%,0%,0.5);cursor:help;}acronym{border-bottom:1px dotted hsla(0,0%,0%,0.5);cursor:help;}abbr[title]{border-bottom:1px dotted hsla(0,0%,0%,0.5);cursor:help;text-decoration:none;}thead{text-align:left;}td,th{text-align:left;border-bottom:1px solid hsla(0,0%,0%,0.12);font-feature-settings:"tnum";-moz-font-feature-settings:"tnum";-ms-font-feature-settings:"tnum";-webkit-font-feature-settings:"tnum";padding-left:1.16667rem;padding-right:1.16667rem;padding-top:0.875rem;padding-bottom:calc(0.875rem - 1px);}th:first-child,td:first-child{padding-left:0;}th:last-child,td:last-child{padding-right:0;}blockquote > :last-child{margin-bottom:0;}blockquote cite{font-size:1rem;line-height:1.75rem;color:hsla(0,0%,0%,0.9);font-weight:400;}blockquote cite:before{content:"— ";}ul,ol{margin-left:0;}@media only screen and (max-width:480px){ul,ol{margin-left:1.75rem;}blockquote{margin-left:-1.3125rem;margin-right:0;padding-left:0.98438rem;}}h1,h2,h3,h4,h5,h6{margin-top:3.5rem;}a{box-shadow:0 1px 0 0 currentColor;color:var(--textLink);text-decoration:none;}a:hover,a:active{box-shadow:none;}mark,ins{background:#007acc;color:white;padding:0.10938rem 0.21875rem;text-decoration:none;}a.gatsby-resp-image-link{box-shadow:none;}a.anchor{box-shadow:none;}a.anchor svg[aria-hidden="true"]{stroke:var(--textLink);}p code{font-size:1rem;}h1 code, h2 code, h3 code, h4 code, h5 code, h6 code{font-size:inherit;}li code{font-size:1rem;}blockquote.translation{font-size:1em;}</style><link as="script" rel="preload" href="/framework-9246dcb394f74450313c.js"/><link as="script" rel="preload" href="/component---src-templates-blog-post-js-37ab84603a0b5df05316.js"/><link as="script" rel="preload" href="/styles-89fd2ae28bdf06750a71.js"/><link as="script" rel="preload" href="/app-0a87eee73eb424d93b37.js"/><link as="script" rel="preload" href="/commons-561b408e6df197aa3b5d.js"/><link as="script" rel="preload" href="/webpack-runtime-6ef72c7cd2cbc5f9b7a2.js"/><link as="fetch" rel="preload" href="/page-data/381488634/page-data.json" crossorigin="anonymous"/><link as="fetch" rel="preload" href="/page-data/sq/d/336482444.json" crossorigin="anonymous"/><link as="fetch" rel="preload" href="/page-data/app-data.json" crossorigin="anonymous"/><script>
              var _hmt = _hmt || [];
              (function() {
                var hm = document.createElement("script");
                hm.src = "https://hm.baidu.com/hm.js?2d469ac33bc67920e2896088ec7b4a77";
                var s = document.getElementsByTagName("script")[0]; 
                s.parentNode.insertBefore(hm, s);
              })();
          </script></head><body class="light"><script>
              (function() {
                window.__onThemeChange = function() {};
                function setTheme(newTheme) {
                  window.__theme = newTheme;
                  preferredTheme = newTheme;
                  document.body.className = newTheme;
                  window.__onThemeChange(newTheme);
                }

                var preferredTheme;
                try {
                  preferredTheme = localStorage.getItem('theme');
                } catch (err) { }

                window.__setPreferredTheme = function(newTheme) {
                  setTheme(newTheme);
                  try {
                    localStorage.setItem('theme', newTheme);
                  } catch (err) {}
                }

                var darkQuery = window.matchMedia('(prefers-color-scheme: dark)');
                darkQuery.addListener(function(e) {
                  window.__setPreferredTheme(e.matches ? 'dark' : 'light')
                });

                setTheme(preferredTheme || (darkQuery.matches ? 'dark' : 'light'));
              })();
            </script><div id="___gatsby"><div style="outline:none" tabindex="-1" id="gatsby-focus-wrapper"><div style="color:var(--textNormal);background:var(--bg);transition:color 0.2s ease-out, background 0.2s ease-out;min-height:100vh"><div style="margin-left:auto;margin-right:auto;max-width:42rem;padding:2.625rem 1.3125rem"><header style="display:flex;justify-content:space-between;align-items:center;margin-bottom:2.625rem"><h3 style="font-family:Montserrat, sans-serif;margin-top:0;margin-bottom:0;height:42px;line-height:2.625rem"><a style="box-shadow:none;text-decoration:none;color:var(--pink)" href="/">ssh的博客</a></h3><div style="height:24px"></div></header><main><article><header><h1 style="color:var(--textTitle)">cube-ui源码学习 swipe组件</h1><p style="font-size:0.83255rem;line-height:1.75rem;display:block;margin-bottom:1.75rem;margin-top:-1.4rem">November 16, 2018<!-- --> • ☕️☕️☕️☕️ 18 min read</p></header><div><p><a href="https://didi.github.io/cube-ui/#/zh-CN/docs/swipe" target="_blank" rel="nofollow noopener noreferrer">swipe组件预览地址（手机模式可体验）</a>
<a href="https://github.com/ustbhuangyi" target="_blank" rel="nofollow noopener noreferrer">作者：黄轶老师</a></p>
<p>先吹一波黄老，昨天体验swipe组件的时候感受到了什么叫丝滑，这可以说是东半球移动端最好用的swipe组件了吧。</p>
<p>先来一段文档中的用法的简化版：</p>
<div class="gatsby-highlight" data-language="js"><pre class="language-js"><code class="language-js"><span class="token operator">&lt;</span>cube<span class="token operator">-</span>swipe<span class="token operator">></span>
    <span class="token operator">&lt;</span>li <span class="token keyword">class</span><span class="token operator">=</span><span class="token string">"swipe-item-wrapper"</span> v<span class="token operator">-</span><span class="token keyword">for</span><span class="token operator">=</span><span class="token string">"(data,index) in swipeData"</span> <span class="token punctuation">:</span>key<span class="token operator">=</span><span class="token string">"data.item.id"</span><span class="token operator">></span>
      <span class="token operator">&lt;</span>cube<span class="token operator">-</span>swipe<span class="token operator">-</span>item
          ref<span class="token operator">=</span><span class="token string">"swipeItem"</span>
          <span class="token punctuation">:</span>btns<span class="token operator">=</span><span class="token string">"data.btns"</span>
          <span class="token punctuation">:</span>index<span class="token operator">=</span><span class="token string">"index"</span>
          @btn<span class="token operator">-</span>click<span class="token operator">=</span><span class="token string">"onBtnClick"</span><span class="token operator">></span>
           <span class="token operator">&lt;</span>div<span class="token operator">></span><span class="token operator">&lt;</span><span class="token operator">/</span>div<span class="token operator">></span>
      <span class="token operator">&lt;</span><span class="token operator">/</span>cube<span class="token operator">-</span>swipe<span class="token operator">-</span>item<span class="token operator">></span>
   <span class="token operator">&lt;</span><span class="token operator">/</span>li<span class="token operator">></span>      
 <span class="token operator">&lt;</span><span class="token operator">/</span>cube<span class="token operator">-</span>swipe<span class="token operator">></span></code></pre></div>
<p>在cube-ui的项目的src/components/swipe目录下，我们可以看到swipe组件被分为swipe.vue和swipe-item.vue。
其实swipe就是列表的外层容器组件，负责处理一些全列表的事件。
swipe-item就是列表中循环出来的某一项元素的组件，负责处理手势等细节。
我们先从swipe.vue入手：</p>
<h3 id="swipevue"><a href="#swipevue" aria-hidden class="anchor"><svg aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>swipe.vue</h3>
<div class="gatsby-highlight" data-language="js"><pre class="language-js"><code class="language-js"><span class="token operator">&lt;</span>template<span class="token operator">></span>
  <span class="token operator">&lt;</span>div <span class="token keyword">class</span><span class="token operator">=</span><span class="token string">"cube-swipe"</span><span class="token operator">></span>
    <span class="token operator">&lt;</span>slot<span class="token operator">></span>
      <span class="token operator">&lt;</span>transition<span class="token operator">-</span>group name<span class="token operator">=</span><span class="token string">"cube-swipe"</span> tag<span class="token operator">=</span><span class="token string">"ul"</span><span class="token operator">></span>
        <span class="token operator">&lt;</span>li v<span class="token operator">-</span><span class="token keyword">for</span><span class="token operator">=</span><span class="token string">"(item, index) in data"</span> <span class="token punctuation">:</span>key<span class="token operator">=</span><span class="token string">"item.item.value"</span><span class="token operator">></span>
          <span class="token operator">&lt;</span>cube<span class="token operator">-</span>swipe<span class="token operator">-</span>item
            <span class="token punctuation">:</span>btns<span class="token operator">=</span><span class="token string">"item.btns"</span>
            <span class="token punctuation">:</span>item<span class="token operator">=</span><span class="token string">"item.item"</span>
            <span class="token punctuation">:</span>index<span class="token operator">=</span><span class="token string">"index"</span>
            <span class="token punctuation">:</span>auto<span class="token operator">-</span>shrink<span class="token operator">=</span><span class="token string">"autoShrink"</span> <span class="token operator">/</span><span class="token operator">></span>
        <span class="token operator">&lt;</span><span class="token operator">/</span>li<span class="token operator">></span>
      <span class="token operator">&lt;</span><span class="token operator">/</span>transition<span class="token operator">-</span>group<span class="token operator">></span>
    <span class="token operator">&lt;</span><span class="token operator">/</span>slot<span class="token operator">></span>
  <span class="token operator">&lt;</span><span class="token operator">/</span>div<span class="token operator">></span>
<span class="token operator">&lt;</span><span class="token operator">/</span>template<span class="token operator">></span></code></pre></div>
<p>我们先从template部分入手， 可以看到结构非常简单，就是一个div中给了一个slot子元素，并且slot有个默认值，
如果用户不传slot的话就默认的带transition-group动效循环出一段cube-swipe-item列表，不使用slot的情况下用户可以传入</p>
<div class="gatsby-highlight" data-language="js"><pre class="language-js"><code class="language-js">swipeData<span class="token punctuation">:</span> <span class="token punctuation">[</span><span class="token punctuation">{</span>
        item<span class="token punctuation">:</span> <span class="token punctuation">{</span>
          text<span class="token punctuation">:</span> <span class="token string">'测试1'</span><span class="token punctuation">,</span>
          value<span class="token punctuation">:</span> <span class="token number">1</span>
        <span class="token punctuation">}</span><span class="token punctuation">,</span>
        btns<span class="token punctuation">:</span> <span class="token punctuation">[</span>
          <span class="token punctuation">{</span>
            action<span class="token punctuation">:</span> <span class="token string">'clear'</span><span class="token punctuation">,</span>
            text<span class="token punctuation">:</span> <span class="token string">'不再关注'</span><span class="token punctuation">,</span>
            color<span class="token punctuation">:</span> <span class="token string">'#c8c7cd'</span>
          <span class="token punctuation">}</span><span class="token punctuation">,</span>
          <span class="token punctuation">{</span>
            action<span class="token punctuation">:</span> <span class="token string">'delete'</span><span class="token punctuation">,</span>
            text<span class="token punctuation">:</span> <span class="token string">'删除'</span><span class="token punctuation">,</span>
            color<span class="token punctuation">:</span> <span class="token string">'#ff3a32'</span>
          <span class="token punctuation">}</span>
        <span class="token punctuation">]</span>
      <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">{</span>
        item<span class="token punctuation">:</span> <span class="token punctuation">{</span>
          text<span class="token punctuation">:</span> <span class="token string">'测试2'</span><span class="token punctuation">,</span>
          value<span class="token punctuation">:</span> <span class="token number">2</span>
        <span class="token punctuation">}</span><span class="token punctuation">,</span>
        btns<span class="token punctuation">:</span> <span class="token punctuation">[</span>
          <span class="token punctuation">{</span>
            action<span class="token punctuation">:</span> <span class="token string">'clear'</span><span class="token punctuation">,</span>
            text<span class="token punctuation">:</span> <span class="token string">'不再关注'</span><span class="token punctuation">,</span>
            color<span class="token punctuation">:</span> <span class="token string">'#c8c7cd'</span>
          <span class="token punctuation">}</span><span class="token punctuation">,</span>
          <span class="token punctuation">{</span>
            action<span class="token punctuation">:</span> <span class="token string">'delete'</span><span class="token punctuation">,</span>
            text<span class="token punctuation">:</span> <span class="token string">'删除'</span><span class="token punctuation">,</span>
            color<span class="token punctuation">:</span> <span class="token string">'#ff3a32'</span>
          <span class="token punctuation">}</span>
        <span class="token punctuation">]</span>
      <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token punctuation">{</span>
        item<span class="token punctuation">:</span> <span class="token punctuation">{</span>
          text<span class="token punctuation">:</span> <span class="token string">'测试3'</span><span class="token punctuation">,</span>
          value<span class="token punctuation">:</span> <span class="token number">3</span>
        <span class="token punctuation">}</span><span class="token punctuation">,</span>
        btns<span class="token punctuation">:</span> <span class="token punctuation">[</span>
          <span class="token punctuation">{</span>
            action<span class="token punctuation">:</span> <span class="token string">'clear'</span><span class="token punctuation">,</span>
            text<span class="token punctuation">:</span> <span class="token string">'不再关注'</span><span class="token punctuation">,</span>
            color<span class="token punctuation">:</span> <span class="token string">'#c8c7cd'</span>
          <span class="token punctuation">}</span><span class="token punctuation">,</span>
          <span class="token punctuation">{</span>
            action<span class="token punctuation">:</span> <span class="token string">'delete'</span><span class="token punctuation">,</span>
            text<span class="token punctuation">:</span> <span class="token string">'删除'</span><span class="token punctuation">,</span>
            color<span class="token punctuation">:</span> <span class="token string">'#ff3a32'</span>
          <span class="token punctuation">}</span>
        <span class="token punctuation">]</span>
      <span class="token punctuation">}</span><span class="token punctuation">]</span></code></pre></div>
<p>这样一段大而全的json数组，渲染出一个列表，不过这种方式比较不灵活。</p>
<div class="gatsby-highlight" data-language="js"><pre class="language-js"><code class="language-js"><span class="token operator">&lt;</span>script type<span class="token operator">=</span><span class="token string">"text/ecmascript-6"</span><span class="token operator">></span>
  <span class="token keyword">import</span> CubeSwipeItem <span class="token keyword">from</span> <span class="token string">'./swipe-item.vue'</span>
  <span class="token keyword">const</span> <span class="token constant">COMPONENT_NAME</span> <span class="token operator">=</span> <span class="token string">'cube-swipe'</span>
  <span class="token keyword">const</span> <span class="token constant">EVENT_ITEM_CLICK</span> <span class="token operator">=</span> <span class="token string">'item-click'</span>
  <span class="token keyword">const</span> <span class="token constant">EVENT_BTN_CLICK</span> <span class="token operator">=</span> <span class="token string">'btn-click'</span>
  <span class="token keyword">export</span> <span class="token keyword">default</span> <span class="token punctuation">{</span>
    name<span class="token punctuation">:</span> <span class="token constant">COMPONENT_NAME</span><span class="token punctuation">,</span>
    <span class="token function">provide</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
      <span class="token keyword">return</span> <span class="token punctuation">{</span>
        swipe<span class="token punctuation">:</span> <span class="token keyword">this</span>
      <span class="token punctuation">}</span>
    <span class="token punctuation">}</span><span class="token punctuation">,</span>
    props<span class="token punctuation">:</span> <span class="token punctuation">{</span>
      data<span class="token punctuation">:</span> <span class="token punctuation">{</span>
        type<span class="token punctuation">:</span> Array<span class="token punctuation">,</span>
        <span class="token keyword">default</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
          <span class="token keyword">return</span> <span class="token punctuation">[</span><span class="token punctuation">]</span>
        <span class="token punctuation">}</span>
      <span class="token punctuation">}</span><span class="token punctuation">,</span>
      autoShrink<span class="token punctuation">:</span> <span class="token punctuation">{</span>
        type<span class="token punctuation">:</span> Boolean<span class="token punctuation">,</span>
        <span class="token keyword">default</span><span class="token punctuation">:</span> <span class="token boolean">false</span>
      <span class="token punctuation">}</span>
    <span class="token punctuation">}</span><span class="token punctuation">,</span>
    <span class="token function">created</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
      <span class="token keyword">this</span><span class="token punctuation">.</span>activeIndex <span class="token operator">=</span> <span class="token operator">-</span><span class="token number">1</span>
      <span class="token keyword">this</span><span class="token punctuation">.</span>items <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span>
    <span class="token punctuation">}</span><span class="token punctuation">,</span>
    methods<span class="token punctuation">:</span> <span class="token punctuation">{</span>
      <span class="token function">addItem</span><span class="token punctuation">(</span>item<span class="token punctuation">)</span> <span class="token punctuation">{</span>
        <span class="token keyword">this</span><span class="token punctuation">.</span>items<span class="token punctuation">.</span><span class="token function">push</span><span class="token punctuation">(</span>item<span class="token punctuation">)</span>
      <span class="token punctuation">}</span><span class="token punctuation">,</span>
      <span class="token function">removeItem</span><span class="token punctuation">(</span>item<span class="token punctuation">)</span> <span class="token punctuation">{</span>
        <span class="token keyword">const</span> index <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">.</span>items<span class="token punctuation">.</span><span class="token function">indexOf</span><span class="token punctuation">(</span>item<span class="token punctuation">)</span>
        <span class="token keyword">this</span><span class="token punctuation">.</span>items<span class="token punctuation">.</span><span class="token function">splice</span><span class="token punctuation">(</span>index<span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">)</span>
        <span class="token keyword">if</span> <span class="token punctuation">(</span>index <span class="token operator">&lt;=</span> <span class="token keyword">this</span><span class="token punctuation">.</span>activeIndex<span class="token punctuation">)</span> <span class="token punctuation">{</span>
          <span class="token keyword">this</span><span class="token punctuation">.</span>activeIndex <span class="token operator">-=</span> <span class="token number">1</span>
        <span class="token punctuation">}</span>
      <span class="token punctuation">}</span><span class="token punctuation">,</span>
      <span class="token function">onItemClick</span><span class="token punctuation">(</span>item<span class="token punctuation">,</span> index<span class="token punctuation">)</span> <span class="token punctuation">{</span>
        <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">$emit</span><span class="token punctuation">(</span><span class="token constant">EVENT_ITEM_CLICK</span><span class="token punctuation">,</span> item<span class="token punctuation">,</span> index<span class="token punctuation">)</span>
      <span class="token punctuation">}</span><span class="token punctuation">,</span>
      <span class="token function">onBtnClick</span><span class="token punctuation">(</span>btn<span class="token punctuation">,</span> index<span class="token punctuation">)</span> <span class="token punctuation">{</span>
        <span class="token keyword">const</span> item <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">.</span>data<span class="token punctuation">[</span>index<span class="token punctuation">]</span>
        <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">$emit</span><span class="token punctuation">(</span><span class="token constant">EVENT_BTN_CLICK</span><span class="token punctuation">,</span> btn<span class="token punctuation">,</span> index<span class="token punctuation">,</span> item<span class="token punctuation">)</span>
      <span class="token punctuation">}</span><span class="token punctuation">,</span>
      <span class="token function">onItemActive</span><span class="token punctuation">(</span>index<span class="token punctuation">)</span> <span class="token punctuation">{</span>
        <span class="token keyword">if</span> <span class="token punctuation">(</span>index <span class="token operator">===</span> <span class="token keyword">this</span><span class="token punctuation">.</span>activeIndex<span class="token punctuation">)</span> <span class="token punctuation">{</span>
          <span class="token keyword">return</span>
        <span class="token punctuation">}</span>
        <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">.</span>activeIndex <span class="token operator">!==</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
          <span class="token keyword">const</span> activeItem <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">.</span>items<span class="token punctuation">[</span><span class="token keyword">this</span><span class="token punctuation">.</span>activeIndex<span class="token punctuation">]</span>
          activeItem<span class="token punctuation">.</span><span class="token function">shrink</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
        <span class="token punctuation">}</span>
        <span class="token keyword">this</span><span class="token punctuation">.</span>activeIndex <span class="token operator">=</span> index
      <span class="token punctuation">}</span>
    <span class="token punctuation">}</span><span class="token punctuation">,</span>
    components<span class="token punctuation">:</span> <span class="token punctuation">{</span>
      CubeSwipeItem
    <span class="token punctuation">}</span>
  <span class="token punctuation">}</span>
<span class="token operator">&lt;</span><span class="token operator">/</span>script<span class="token operator">></span></code></pre></div>
<p>script的data和methods里提供了很多东西，但是在template里却没有使用到，那么我们猜测这些都是提供给子组件使用的，
provider里把自身实例提供给了子组件</p>
<div class="gatsby-highlight" data-language="js"><pre class="language-js"><code class="language-js"> <span class="token function">provide</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
      <span class="token keyword">return</span> <span class="token punctuation">{</span>
        swipe<span class="token punctuation">:</span> <span class="token keyword">this</span>
      <span class="token punctuation">}</span>
    <span class="token punctuation">}</span><span class="token punctuation">,</span></code></pre></div>
<p>那么我们接下来就去探究swipe-item组件。</p>
<h3 id="swipe-item"><a href="#swipe-item" aria-hidden class="anchor"><svg aria-hidden="true" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>swipe-item</h3>
<div class="gatsby-highlight" data-language="js"><pre class="language-js"><code class="language-js"><span class="token operator">&lt;</span>template<span class="token operator">></span>
  <span class="token operator">&lt;</span>div ref<span class="token operator">=</span><span class="token string">"swipeItem"</span>
       @transitionend<span class="token operator">=</span><span class="token string">"onTransitionEnd"</span>
       @touchstart<span class="token operator">=</span><span class="token string">"onTouchStart"</span>
       @touchmove<span class="token operator">=</span><span class="token string">"onTouchMove"</span>
       @touchend<span class="token operator">=</span><span class="token string">"onTouchEnd"</span>
       <span class="token keyword">class</span><span class="token operator">=</span><span class="token string">"cube-swipe-item"</span><span class="token operator">></span>
    <span class="token operator">&lt;</span>slot<span class="token operator">></span>
      <span class="token operator">&lt;</span>div @click<span class="token operator">=</span><span class="token string">"clickItem"</span> <span class="token keyword">class</span><span class="token operator">=</span><span class="token string">"cube-swipe-item-inner border-bottom-1px"</span><span class="token operator">></span>
        <span class="token operator">&lt;</span>span<span class="token operator">></span><span class="token punctuation">{</span><span class="token punctuation">{</span>item<span class="token punctuation">.</span>text<span class="token punctuation">}</span><span class="token punctuation">}</span><span class="token operator">&lt;</span><span class="token operator">/</span>span<span class="token operator">></span>
      <span class="token operator">&lt;</span><span class="token operator">/</span>div<span class="token operator">></span>
    <span class="token operator">&lt;</span><span class="token operator">/</span>slot<span class="token operator">></span>
    <span class="token operator">&lt;</span>ul <span class="token keyword">class</span><span class="token operator">=</span><span class="token string">"cube-swipe-btns"</span><span class="token operator">></span>
      <span class="token operator">&lt;</span>li ref<span class="token operator">=</span><span class="token string">"btns"</span>
          v<span class="token operator">-</span><span class="token keyword">for</span><span class="token operator">=</span><span class="token string">"btn in btns"</span>
          <span class="token keyword">class</span><span class="token operator">=</span><span class="token string">"cube-swipe-btn"</span>
          <span class="token punctuation">:</span>style<span class="token operator">=</span><span class="token string">"genBtnStyl(btn)"</span>
          @click<span class="token punctuation">.</span>prevent<span class="token operator">=</span><span class="token string">"clickBtn(btn)"</span><span class="token operator">></span>
        <span class="token operator">&lt;</span>span <span class="token keyword">class</span><span class="token operator">=</span><span class="token string">"text"</span><span class="token operator">></span><span class="token punctuation">{</span><span class="token punctuation">{</span>btn<span class="token punctuation">.</span>text<span class="token punctuation">}</span><span class="token punctuation">}</span><span class="token operator">&lt;</span><span class="token operator">/</span>span<span class="token operator">></span>
      <span class="token operator">&lt;</span><span class="token operator">/</span>li<span class="token operator">></span>
    <span class="token operator">&lt;</span><span class="token operator">/</span>ul<span class="token operator">></span>
  <span class="token operator">&lt;</span><span class="token operator">/</span>div<span class="token operator">></span>
<span class="token operator">&lt;</span><span class="token operator">/</span>template<span class="token operator">></span>

<span class="token operator">&lt;</span>style lang<span class="token operator">=</span><span class="token string">"stylus"</span> rel<span class="token operator">=</span><span class="token string">"stylesheet/stylus"</span><span class="token operator">></span>
  @require <span class="token string">"../../common/stylus/variable.styl"</span>
  <span class="token punctuation">.</span>cube<span class="token operator">-</span>swipe<span class="token operator">-</span>item
    position<span class="token punctuation">:</span> relative
  <span class="token punctuation">.</span>cube<span class="token operator">-</span>swipe<span class="token operator">-</span>item<span class="token operator">-</span>inner
    height<span class="token punctuation">:</span> <span class="token number">60</span>px
    line<span class="token operator">-</span>height<span class="token punctuation">:</span> <span class="token number">60</span>px
    font<span class="token operator">-</span>size<span class="token punctuation">:</span> $fontsize<span class="token operator">-</span>large
    padding<span class="token operator">-</span>left<span class="token punctuation">:</span> <span class="token number">20</span>px
  <span class="token punctuation">.</span>cube<span class="token operator">-</span>swipe<span class="token operator">-</span>btn
    display<span class="token punctuation">:</span> flex
    align<span class="token operator">-</span>items<span class="token punctuation">:</span> center
    position<span class="token punctuation">:</span> absolute
    top<span class="token punctuation">:</span> <span class="token number">0</span>
    left<span class="token punctuation">:</span> <span class="token number">100</span><span class="token operator">%</span>
    height<span class="token punctuation">:</span> <span class="token number">100</span><span class="token operator">%</span>
    text<span class="token operator">-</span>align<span class="token punctuation">:</span> left
    font<span class="token operator">-</span>size<span class="token punctuation">:</span> $fontsize<span class="token operator">-</span>large
    <span class="token punctuation">.</span>text
      flex<span class="token punctuation">:</span> <span class="token number">1</span>
      padding<span class="token punctuation">:</span> <span class="token number">0</span> <span class="token number">20</span>px
      white<span class="token operator">-</span>space<span class="token punctuation">:</span> nowrap
      color<span class="token punctuation">:</span> $swipe<span class="token operator">-</span>btn<span class="token operator">-</span>color
<span class="token operator">&lt;</span><span class="token operator">/</span>style<span class="token operator">></span></code></pre></div>
<p>可以看到swipe-item的结构也非常简单， 也提供了slot插槽定制子组件的元素
并且在子组件的旁边有个初始隐藏的ul结构 用来循环btns来生成侧滑出来的按钮
.cube-swipe-btn这个类是绝对定位并且left 100% 也就是相对于父relative容器
.cube-swipe-item的宽度偏移 正好隐藏到边缘外。</p>
<p>接下来我们看一下script部分</p>
<div class="gatsby-highlight" data-language="js"><pre class="language-js"><code class="language-js"><span class="token operator">&lt;</span>script type<span class="token operator">=</span><span class="token string">"text/ecmascript-6"</span><span class="token operator">></span>
  <span class="token keyword">import</span> <span class="token punctuation">{</span>
    getRect<span class="token punctuation">,</span>
    prefixStyle
  <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'../../common/helpers/dom'</span>
  <span class="token keyword">import</span> <span class="token punctuation">{</span> easeOutQuart<span class="token punctuation">,</span> easeOutCubic <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'../../common/helpers/ease'</span>
  <span class="token keyword">import</span> <span class="token punctuation">{</span> getNow <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'../../common/lang/date'</span>
  <span class="token keyword">const</span> <span class="token constant">COMPONENT_NAME</span> <span class="token operator">=</span> <span class="token string">'cube-swipe-item'</span>
  <span class="token keyword">const</span> <span class="token constant">EVENT_ITEM_CLICK</span> <span class="token operator">=</span> <span class="token string">'item-click'</span>
  <span class="token keyword">const</span> <span class="token constant">EVENT_BTN_CLICK</span> <span class="token operator">=</span> <span class="token string">'btn-click'</span>
  <span class="token keyword">const</span> <span class="token constant">EVENT_SCROLL</span> <span class="token operator">=</span> <span class="token string">'scroll'</span>
  <span class="token keyword">const</span> <span class="token constant">EVENT_ACTIVE</span> <span class="token operator">=</span> <span class="token string">'active'</span>
  <span class="token keyword">const</span> <span class="token constant">DIRECTION_LEFT</span> <span class="token operator">=</span> <span class="token number">1</span>
  <span class="token keyword">const</span> <span class="token constant">DIRECTION_RIGHT</span> <span class="token operator">=</span> <span class="token operator">-</span><span class="token number">1</span>
  <span class="token keyword">const</span> <span class="token constant">STATE_SHRINK</span> <span class="token operator">=</span> <span class="token number">0</span>
  <span class="token keyword">const</span> <span class="token constant">STATE_GROW</span> <span class="token operator">=</span> <span class="token number">1</span>
  <span class="token keyword">const</span> easingTime <span class="token operator">=</span> <span class="token number">600</span>
  <span class="token keyword">const</span> momentumLimitTime <span class="token operator">=</span> <span class="token number">300</span>
  <span class="token keyword">const</span> momentumLimitDistance <span class="token operator">=</span> <span class="token number">15</span>
  <span class="token keyword">const</span> directionLockThreshold <span class="token operator">=</span> <span class="token number">5</span>
  <span class="token keyword">const</span> transform <span class="token operator">=</span> <span class="token function">prefixStyle</span><span class="token punctuation">(</span><span class="token string">'transform'</span><span class="token punctuation">)</span>
  <span class="token keyword">const</span> transitionProperty <span class="token operator">=</span> <span class="token function">prefixStyle</span><span class="token punctuation">(</span><span class="token string">'transitionProperty'</span><span class="token punctuation">)</span>
  <span class="token keyword">const</span> transitionDuration <span class="token operator">=</span> <span class="token function">prefixStyle</span><span class="token punctuation">(</span><span class="token string">'transitionDuration'</span><span class="token punctuation">)</span>
  <span class="token keyword">const</span> transitionTimingFunction <span class="token operator">=</span> <span class="token function">prefixStyle</span><span class="token punctuation">(</span><span class="token string">'transitionTimingFunction'</span><span class="token punctuation">)</span>
  <span class="token keyword">export</span> <span class="token keyword">default</span> <span class="token punctuation">{</span>
    name<span class="token punctuation">:</span> <span class="token constant">COMPONENT_NAME</span><span class="token punctuation">,</span>
    inject<span class="token punctuation">:</span> <span class="token punctuation">[</span><span class="token string">'swipe'</span><span class="token punctuation">]</span><span class="token punctuation">,</span>
    props<span class="token punctuation">:</span> <span class="token punctuation">{</span>
      item<span class="token punctuation">:</span> <span class="token punctuation">{</span>
        type<span class="token punctuation">:</span> Object<span class="token punctuation">,</span>
        <span class="token keyword">default</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
          <span class="token keyword">return</span> <span class="token punctuation">{</span><span class="token punctuation">}</span>
        <span class="token punctuation">}</span>
      <span class="token punctuation">}</span><span class="token punctuation">,</span>
      btns<span class="token punctuation">:</span> <span class="token punctuation">{</span>
        type<span class="token punctuation">:</span> Array<span class="token punctuation">,</span>
        <span class="token keyword">default</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
          <span class="token keyword">return</span> <span class="token punctuation">[</span><span class="token punctuation">]</span>
        <span class="token punctuation">}</span>
      <span class="token punctuation">}</span><span class="token punctuation">,</span>
      index<span class="token punctuation">:</span> <span class="token punctuation">{</span>
        type<span class="token punctuation">:</span> Number<span class="token punctuation">,</span>
        index<span class="token punctuation">:</span> <span class="token operator">-</span><span class="token number">1</span>
      <span class="token punctuation">}</span><span class="token punctuation">,</span>
      autoShrink<span class="token punctuation">:</span> <span class="token punctuation">{</span>
        type<span class="token punctuation">:</span> Boolean<span class="token punctuation">,</span>
        <span class="token keyword">default</span><span class="token punctuation">:</span> <span class="token boolean">false</span>
      <span class="token punctuation">}</span>
    <span class="token punctuation">}</span><span class="token punctuation">,</span>
    watch<span class="token punctuation">:</span> <span class="token punctuation">{</span>
      <span class="token function">btns</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
        <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">$nextTick</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span>
          <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">refresh</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
        <span class="token punctuation">}</span><span class="token punctuation">)</span>
      <span class="token punctuation">}</span>
    <span class="token punctuation">}</span><span class="token punctuation">,</span>
    <span class="token function">created</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
      <span class="token keyword">this</span><span class="token punctuation">.</span>x <span class="token operator">=</span> <span class="token number">0</span>
      <span class="token keyword">this</span><span class="token punctuation">.</span>state <span class="token operator">=</span> <span class="token constant">STATE_SHRINK</span>
      <span class="token keyword">this</span><span class="token punctuation">.</span>swipe<span class="token punctuation">.</span><span class="token function">addItem</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">)</span>
    <span class="token punctuation">}</span><span class="token punctuation">,</span>
    <span class="token function">mounted</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
      <span class="token keyword">this</span><span class="token punctuation">.</span>scrollerStyle <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">.</span>$refs<span class="token punctuation">.</span>swipeItem<span class="token punctuation">.</span>style
      <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">$nextTick</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span>
        <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">refresh</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
      <span class="token punctuation">}</span><span class="token punctuation">)</span>
      <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">$on</span><span class="token punctuation">(</span><span class="token constant">EVENT_SCROLL</span><span class="token punctuation">,</span> <span class="token keyword">this</span><span class="token punctuation">.</span>_handleBtns<span class="token punctuation">)</span>
    <span class="token punctuation">}</span><span class="token punctuation">,</span>
    methods<span class="token punctuation">:</span> <span class="token punctuation">{</span>
      <span class="token function">_initCachedBtns</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
        <span class="token keyword">this</span><span class="token punctuation">.</span>cachedBtns <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span>
        <span class="token keyword">const</span> len <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">.</span>$refs<span class="token punctuation">.</span>btns<span class="token punctuation">.</span>length
        <span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">let</span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator">&lt;</span> len<span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
          <span class="token keyword">this</span><span class="token punctuation">.</span>cachedBtns<span class="token punctuation">.</span><span class="token function">push</span><span class="token punctuation">(</span><span class="token punctuation">{</span>
            width<span class="token punctuation">:</span> <span class="token function">getRect</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">.</span>$refs<span class="token punctuation">.</span>btns<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">.</span>width
          <span class="token punctuation">}</span><span class="token punctuation">)</span>
        <span class="token punctuation">}</span>
      <span class="token punctuation">}</span><span class="token punctuation">,</span>
      <span class="token function">_handleBtns</span><span class="token punctuation">(</span>x<span class="token punctuation">)</span> <span class="token punctuation">{</span>
        <span class="token comment">/* istanbul ignore if */</span>
        <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">.</span>btns<span class="token punctuation">.</span>length <span class="token operator">===</span> <span class="token number">0</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
          <span class="token keyword">return</span>
        <span class="token punctuation">}</span>
        <span class="token keyword">const</span> len <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">.</span>$refs<span class="token punctuation">.</span>btns<span class="token punctuation">.</span>length
        <span class="token keyword">let</span> delta <span class="token operator">=</span> <span class="token number">0</span>
        <span class="token keyword">let</span> totalWidth <span class="token operator">=</span> <span class="token operator">-</span><span class="token keyword">this</span><span class="token punctuation">.</span>maxScrollX
        <span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">let</span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator">&lt;</span> len<span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
          <span class="token keyword">const</span> btn <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">.</span>$refs<span class="token punctuation">.</span>btns<span class="token punctuation">[</span>i<span class="token punctuation">]</span>
          <span class="token keyword">let</span> rate <span class="token operator">=</span> <span class="token punctuation">(</span>totalWidth <span class="token operator">-</span> delta<span class="token punctuation">)</span> <span class="token operator">/</span> totalWidth
          <span class="token keyword">let</span> width
          <span class="token keyword">let</span> translate <span class="token operator">=</span> rate <span class="token operator">*</span> x <span class="token operator">-</span> x
          <span class="token keyword">if</span> <span class="token punctuation">(</span>x <span class="token operator">&lt;</span> <span class="token keyword">this</span><span class="token punctuation">.</span>maxScrollX<span class="token punctuation">)</span> <span class="token punctuation">{</span>
            width <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">.</span>cachedBtns<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span>width <span class="token operator">+</span> rate <span class="token operator">*</span> <span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">.</span>maxScrollX <span class="token operator">-</span> x<span class="token punctuation">)</span>
          <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span>
            width <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">.</span>cachedBtns<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span>width
          <span class="token punctuation">}</span>
          delta <span class="token operator">+=</span> <span class="token keyword">this</span><span class="token punctuation">.</span>cachedBtns<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span>width
          btn<span class="token punctuation">.</span>style<span class="token punctuation">.</span>width <span class="token operator">=</span> <span class="token template-string"><span class="token string">`</span><span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span>width<span class="token interpolation-punctuation punctuation">}</span></span><span class="token string">px`</span></span>
          btn<span class="token punctuation">.</span>style<span class="token punctuation">[</span>transform<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token template-string"><span class="token string">`translate(</span><span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span>translate<span class="token interpolation-punctuation punctuation">}</span></span><span class="token string">px)`</span></span>
          btn<span class="token punctuation">.</span>style<span class="token punctuation">[</span>transitionDuration<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token string">'0ms'</span>
        <span class="token punctuation">}</span>
      <span class="token punctuation">}</span><span class="token punctuation">,</span>
      <span class="token function">_isInBtns</span><span class="token punctuation">(</span>target<span class="token punctuation">)</span> <span class="token punctuation">{</span>
        <span class="token keyword">let</span> parent <span class="token operator">=</span> target
        <span class="token keyword">let</span> flag <span class="token operator">=</span> <span class="token boolean">false</span>
        <span class="token keyword">while</span> <span class="token punctuation">(</span>parent <span class="token operator">&amp;&amp;</span> parent<span class="token punctuation">.</span>className<span class="token punctuation">.</span><span class="token function">indexOf</span><span class="token punctuation">(</span><span class="token string">'cube-swipe-item'</span><span class="token punctuation">)</span> <span class="token operator">&lt;</span> <span class="token number">0</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
          <span class="token keyword">if</span> <span class="token punctuation">(</span>parent<span class="token punctuation">.</span>className<span class="token punctuation">.</span><span class="token function">indexOf</span><span class="token punctuation">(</span><span class="token string">'cube-swipe-btns'</span><span class="token punctuation">)</span> <span class="token operator">>=</span> <span class="token number">0</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
            flag <span class="token operator">=</span> <span class="token boolean">true</span>
            <span class="token keyword">break</span>
          <span class="token punctuation">}</span>
          parent <span class="token operator">=</span> parent<span class="token punctuation">.</span>parentNode
        <span class="token punctuation">}</span>
        <span class="token keyword">return</span> flag
      <span class="token punctuation">}</span><span class="token punctuation">,</span>
      <span class="token function">_calculateBtnsWidth</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
        <span class="token keyword">let</span> width <span class="token operator">=</span> <span class="token number">0</span>
        <span class="token keyword">const</span> len <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">.</span>cachedBtns<span class="token punctuation">.</span>length
        <span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">let</span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator">&lt;</span> len<span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
          width <span class="token operator">+=</span> <span class="token keyword">this</span><span class="token punctuation">.</span>cachedBtns<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span>width
        <span class="token punctuation">}</span>
        <span class="token keyword">this</span><span class="token punctuation">.</span>maxScrollX <span class="token operator">=</span> <span class="token operator">-</span>width
      <span class="token punctuation">}</span><span class="token punctuation">,</span>
      <span class="token function">_translate</span><span class="token punctuation">(</span>x<span class="token punctuation">,</span> useZ<span class="token punctuation">)</span> <span class="token punctuation">{</span>
        <span class="token keyword">let</span> translateZ <span class="token operator">=</span> useZ <span class="token operator">?</span> <span class="token string">' translateZ(0)'</span> <span class="token punctuation">:</span> <span class="token string">''</span>
        <span class="token keyword">this</span><span class="token punctuation">.</span>scrollerStyle<span class="token punctuation">[</span>transform<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token template-string"><span class="token string">`translate(</span><span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span>x<span class="token interpolation-punctuation punctuation">}</span></span><span class="token string">px,0)</span><span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span>translateZ<span class="token interpolation-punctuation punctuation">}</span></span><span class="token string">`</span></span>
        <span class="token keyword">this</span><span class="token punctuation">.</span>x <span class="token operator">=</span> x
      <span class="token punctuation">}</span><span class="token punctuation">,</span>
      <span class="token function">_transitionProperty</span><span class="token punctuation">(</span>property <span class="token operator">=</span> <span class="token string">'transform'</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
        <span class="token keyword">this</span><span class="token punctuation">.</span>scrollerStyle<span class="token punctuation">[</span>transitionProperty<span class="token punctuation">]</span> <span class="token operator">=</span> property
      <span class="token punctuation">}</span><span class="token punctuation">,</span>
      <span class="token function">_transitionTimingFunction</span><span class="token punctuation">(</span>easing<span class="token punctuation">)</span> <span class="token punctuation">{</span>
        <span class="token keyword">this</span><span class="token punctuation">.</span>scrollerStyle<span class="token punctuation">[</span>transitionTimingFunction<span class="token punctuation">]</span> <span class="token operator">=</span> easing
      <span class="token punctuation">}</span><span class="token punctuation">,</span>
      <span class="token function">_transitionTime</span><span class="token punctuation">(</span>time <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
        <span class="token keyword">this</span><span class="token punctuation">.</span>scrollerStyle<span class="token punctuation">[</span>transitionDuration<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token template-string"><span class="token string">`</span><span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span>time<span class="token interpolation-punctuation punctuation">}</span></span><span class="token string">ms`</span></span>
      <span class="token punctuation">}</span><span class="token punctuation">,</span>
      <span class="token function">_getComputedPositionX</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
        <span class="token keyword">let</span> matrix <span class="token operator">=</span> window<span class="token punctuation">.</span><span class="token function">getComputedStyle</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">.</span>$refs<span class="token punctuation">.</span>swipeItem<span class="token punctuation">,</span> <span class="token keyword">null</span><span class="token punctuation">)</span>
        matrix <span class="token operator">=</span> matrix<span class="token punctuation">[</span>transform<span class="token punctuation">]</span><span class="token punctuation">.</span><span class="token function">split</span><span class="token punctuation">(</span><span class="token string">')'</span><span class="token punctuation">)</span><span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">.</span><span class="token function">split</span><span class="token punctuation">(</span><span class="token string">', '</span><span class="token punctuation">)</span>
        <span class="token keyword">let</span> x <span class="token operator">=</span> <span class="token operator">+</span><span class="token punctuation">(</span>matrix<span class="token punctuation">[</span><span class="token number">12</span><span class="token punctuation">]</span> <span class="token operator">||</span> matrix<span class="token punctuation">[</span><span class="token number">4</span><span class="token punctuation">]</span><span class="token punctuation">)</span>
        <span class="token keyword">return</span> x
      <span class="token punctuation">}</span><span class="token punctuation">,</span>
      <span class="token function">_translateBtns</span><span class="token punctuation">(</span>time<span class="token punctuation">,</span> easing<span class="token punctuation">,</span> extend<span class="token punctuation">)</span> <span class="token punctuation">{</span>
        <span class="token comment">/* istanbul ignore if */</span>
        <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">.</span>btns<span class="token punctuation">.</span>length <span class="token operator">===</span> <span class="token number">0</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
          <span class="token keyword">return</span>
        <span class="token punctuation">}</span>
        <span class="token keyword">const</span> len <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">.</span>$refs<span class="token punctuation">.</span>btns<span class="token punctuation">.</span>length
        <span class="token keyword">let</span> delta <span class="token operator">=</span> <span class="token number">0</span>
        <span class="token keyword">let</span> translate <span class="token operator">=</span> <span class="token number">0</span>
        <span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">let</span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator">&lt;</span> len<span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
          <span class="token keyword">const</span> btn <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">.</span>$refs<span class="token punctuation">.</span>btns<span class="token punctuation">[</span>i<span class="token punctuation">]</span>
          <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">.</span>state <span class="token operator">===</span> <span class="token constant">STATE_GROW</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
            translate <span class="token operator">=</span> delta
          <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span>
            translate <span class="token operator">=</span> <span class="token number">0</span>
          <span class="token punctuation">}</span>
          delta <span class="token operator">+=</span> <span class="token keyword">this</span><span class="token punctuation">.</span>cachedBtns<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span>width
          btn<span class="token punctuation">.</span>style<span class="token punctuation">[</span>transform<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token template-string"><span class="token string">`translate(</span><span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span>translate<span class="token interpolation-punctuation punctuation">}</span></span><span class="token string">px,0) translateZ(0)`</span></span>
          btn<span class="token punctuation">.</span>style<span class="token punctuation">[</span>transitionProperty<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token string">'all'</span>
          btn<span class="token punctuation">.</span>style<span class="token punctuation">[</span>transitionTimingFunction<span class="token punctuation">]</span> <span class="token operator">=</span> easing
          btn<span class="token punctuation">.</span>style<span class="token punctuation">[</span>transitionDuration<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token template-string"><span class="token string">`</span><span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span>time<span class="token interpolation-punctuation punctuation">}</span></span><span class="token string">ms`</span></span>
          <span class="token keyword">if</span> <span class="token punctuation">(</span>extend<span class="token punctuation">)</span> <span class="token punctuation">{</span>
            btn<span class="token punctuation">.</span>style<span class="token punctuation">.</span>width <span class="token operator">=</span> <span class="token template-string"><span class="token string">`</span><span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span><span class="token keyword">this</span><span class="token punctuation">.</span>cachedBtns<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span>width<span class="token interpolation-punctuation punctuation">}</span></span><span class="token string">px`</span></span>
          <span class="token punctuation">}</span>
        <span class="token punctuation">}</span>
      <span class="token punctuation">}</span><span class="token punctuation">,</span>
      <span class="token function">refresh</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
        <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">.</span>btns<span class="token punctuation">.</span>length <span class="token operator">></span> <span class="token number">0</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
          <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">_initCachedBtns</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
          <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">_calculateBtnsWidth</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
        <span class="token punctuation">}</span>
        <span class="token keyword">this</span><span class="token punctuation">.</span>endTime <span class="token operator">=</span> <span class="token number">0</span>
      <span class="token punctuation">}</span><span class="token punctuation">,</span>
      <span class="token function">shrink</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
        <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">stop</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
        <span class="token keyword">this</span><span class="token punctuation">.</span>state <span class="token operator">=</span> <span class="token constant">STATE_SHRINK</span>
        <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">$nextTick</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span>
          <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">scrollTo</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> easingTime<span class="token punctuation">,</span> easeOutQuart<span class="token punctuation">)</span>
          <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">_translateBtns</span><span class="token punctuation">(</span>easingTime<span class="token punctuation">,</span> easeOutQuart<span class="token punctuation">)</span>
        <span class="token punctuation">}</span><span class="token punctuation">)</span>
      <span class="token punctuation">}</span><span class="token punctuation">,</span>
      <span class="token function">grow</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
        <span class="token keyword">this</span><span class="token punctuation">.</span>state <span class="token operator">=</span> <span class="token constant">STATE_GROW</span>
        <span class="token keyword">const</span> extend <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">.</span>x <span class="token operator">&lt;</span> <span class="token keyword">this</span><span class="token punctuation">.</span>maxScrollX
        <span class="token keyword">let</span> easing <span class="token operator">=</span> easeOutCubic
        <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">scrollTo</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">.</span>maxScrollX<span class="token punctuation">,</span> easingTime<span class="token punctuation">,</span> easing<span class="token punctuation">)</span>
        <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">_translateBtns</span><span class="token punctuation">(</span>easingTime<span class="token punctuation">,</span> easing<span class="token punctuation">,</span> extend<span class="token punctuation">)</span>
      <span class="token punctuation">}</span><span class="token punctuation">,</span>
      <span class="token function">scrollTo</span><span class="token punctuation">(</span>x<span class="token punctuation">,</span> time<span class="token punctuation">,</span> easing<span class="token punctuation">)</span> <span class="token punctuation">{</span>
        <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">_transitionProperty</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
        <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">_transitionTimingFunction</span><span class="token punctuation">(</span>easing<span class="token punctuation">)</span>
        <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">_transitionTime</span><span class="token punctuation">(</span>time<span class="token punctuation">)</span>
        <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">_translate</span><span class="token punctuation">(</span>x<span class="token punctuation">,</span> <span class="token boolean">true</span><span class="token punctuation">)</span>
        <span class="token keyword">if</span> <span class="token punctuation">(</span>time<span class="token punctuation">)</span> <span class="token punctuation">{</span>
          <span class="token keyword">this</span><span class="token punctuation">.</span>isInTransition <span class="token operator">=</span> <span class="token boolean">true</span>
        <span class="token punctuation">}</span>
      <span class="token punctuation">}</span><span class="token punctuation">,</span>
      <span class="token function">genBtnStyl</span><span class="token punctuation">(</span>btn<span class="token punctuation">)</span> <span class="token punctuation">{</span>
        <span class="token keyword">return</span> <span class="token template-string"><span class="token string">`background: </span><span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span>btn<span class="token punctuation">.</span>color<span class="token interpolation-punctuation punctuation">}</span></span><span class="token string">`</span></span>
      <span class="token punctuation">}</span><span class="token punctuation">,</span>
      <span class="token function">clickItem</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
        <span class="token keyword">this</span><span class="token punctuation">.</span>swipe<span class="token punctuation">.</span><span class="token function">onItemClick</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">.</span>item<span class="token punctuation">,</span> <span class="token keyword">this</span><span class="token punctuation">.</span>index<span class="token punctuation">)</span>
        <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">$emit</span><span class="token punctuation">(</span><span class="token constant">EVENT_ITEM_CLICK</span><span class="token punctuation">,</span> <span class="token keyword">this</span><span class="token punctuation">.</span>item<span class="token punctuation">,</span> <span class="token keyword">this</span><span class="token punctuation">.</span>index<span class="token punctuation">)</span>
      <span class="token punctuation">}</span><span class="token punctuation">,</span>
      <span class="token function">clickBtn</span><span class="token punctuation">(</span>btn<span class="token punctuation">)</span> <span class="token punctuation">{</span>
        <span class="token keyword">this</span><span class="token punctuation">.</span>swipe<span class="token punctuation">.</span><span class="token function">onBtnClick</span><span class="token punctuation">(</span>btn<span class="token punctuation">,</span> <span class="token keyword">this</span><span class="token punctuation">.</span>index<span class="token punctuation">)</span>
        <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">$emit</span><span class="token punctuation">(</span><span class="token constant">EVENT_BTN_CLICK</span><span class="token punctuation">,</span> btn<span class="token punctuation">,</span> <span class="token keyword">this</span><span class="token punctuation">.</span>index<span class="token punctuation">)</span>
        <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">.</span>autoShrink<span class="token punctuation">)</span> <span class="token punctuation">{</span>
          <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">shrink</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
        <span class="token punctuation">}</span>
      <span class="token punctuation">}</span><span class="token punctuation">,</span>
      <span class="token function">stop</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
        <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">.</span>isInTransition<span class="token punctuation">)</span> <span class="token punctuation">{</span>
          <span class="token keyword">this</span><span class="token punctuation">.</span>isInTransition <span class="token operator">=</span> <span class="token boolean">false</span>
          <span class="token keyword">let</span> x <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">.</span>state <span class="token operator">===</span> <span class="token constant">STATE_SHRINK</span> <span class="token operator">?</span> <span class="token number">0</span> <span class="token punctuation">:</span> <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">_getComputedPositionX</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
          <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">_translate</span><span class="token punctuation">(</span>x<span class="token punctuation">)</span>
          <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">$emit</span><span class="token punctuation">(</span><span class="token constant">EVENT_SCROLL</span><span class="token punctuation">,</span> <span class="token keyword">this</span><span class="token punctuation">.</span>x<span class="token punctuation">)</span>
        <span class="token punctuation">}</span>
      <span class="token punctuation">}</span><span class="token punctuation">,</span>
      <span class="token function">onTouchStart</span><span class="token punctuation">(</span>e<span class="token punctuation">)</span> <span class="token punctuation">{</span>
        <span class="token keyword">this</span><span class="token punctuation">.</span>swipe<span class="token punctuation">.</span><span class="token function">onItemActive</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">.</span>index<span class="token punctuation">)</span>
        <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">$emit</span><span class="token punctuation">(</span><span class="token constant">EVENT_ACTIVE</span><span class="token punctuation">,</span> <span class="token keyword">this</span><span class="token punctuation">.</span>index<span class="token punctuation">)</span>
        <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">stop</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
        <span class="token keyword">this</span><span class="token punctuation">.</span>moved <span class="token operator">=</span> <span class="token boolean">false</span>
        <span class="token keyword">this</span><span class="token punctuation">.</span>movingDirectionX <span class="token operator">=</span> <span class="token number">0</span>
        <span class="token keyword">const</span> point <span class="token operator">=</span> e<span class="token punctuation">.</span>touches<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span>
        <span class="token keyword">this</span><span class="token punctuation">.</span>pointX <span class="token operator">=</span> point<span class="token punctuation">.</span>pageX
        <span class="token keyword">this</span><span class="token punctuation">.</span>pointY <span class="token operator">=</span> point<span class="token punctuation">.</span>pageY
        <span class="token keyword">this</span><span class="token punctuation">.</span>distX <span class="token operator">=</span> <span class="token number">0</span>
        <span class="token keyword">this</span><span class="token punctuation">.</span>distY <span class="token operator">=</span> <span class="token number">0</span>
        <span class="token keyword">this</span><span class="token punctuation">.</span>startX <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">.</span>x
        <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">_transitionTime</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
        <span class="token keyword">this</span><span class="token punctuation">.</span>startTime <span class="token operator">=</span> <span class="token function">getNow</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
        <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">.</span>state <span class="token operator">===</span> <span class="token constant">STATE_GROW</span> <span class="token operator">&amp;&amp;</span> <span class="token operator">!</span><span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">_isInBtns</span><span class="token punctuation">(</span>e<span class="token punctuation">.</span>target<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
          <span class="token keyword">this</span><span class="token punctuation">.</span>shrinkTimer <span class="token operator">=</span> <span class="token function">setTimeout</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span>
            <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">shrink</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
          <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token number">300</span><span class="token punctuation">)</span>
        <span class="token punctuation">}</span>
      <span class="token punctuation">}</span><span class="token punctuation">,</span>
      <span class="token function">onTouchMove</span><span class="token punctuation">(</span>e<span class="token punctuation">)</span> <span class="token punctuation">{</span>
        <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">.</span>moved<span class="token punctuation">)</span> <span class="token punctuation">{</span>
          <span class="token function">clearTimeout</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">.</span>shrinkTimer<span class="token punctuation">)</span>
          e<span class="token punctuation">.</span><span class="token function">stopPropagation</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
        <span class="token punctuation">}</span>
        <span class="token comment">/* istanbul ignore if */</span>
        <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">.</span>isInTransition<span class="token punctuation">)</span> <span class="token punctuation">{</span>
          <span class="token keyword">return</span>
        <span class="token punctuation">}</span>
        e<span class="token punctuation">.</span><span class="token function">preventDefault</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
        <span class="token keyword">const</span> point <span class="token operator">=</span> e<span class="token punctuation">.</span>touches<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span>
        <span class="token keyword">let</span> deltaX <span class="token operator">=</span> point<span class="token punctuation">.</span>pageX <span class="token operator">-</span> <span class="token keyword">this</span><span class="token punctuation">.</span>pointX
        <span class="token keyword">let</span> deltaY <span class="token operator">=</span> point<span class="token punctuation">.</span>pageY <span class="token operator">-</span> <span class="token keyword">this</span><span class="token punctuation">.</span>pointY
        <span class="token keyword">this</span><span class="token punctuation">.</span>pointX <span class="token operator">=</span> point<span class="token punctuation">.</span>pageX
        <span class="token keyword">this</span><span class="token punctuation">.</span>pointY <span class="token operator">=</span> point<span class="token punctuation">.</span>pageY
        <span class="token keyword">this</span><span class="token punctuation">.</span>distX <span class="token operator">+=</span> deltaX
        <span class="token keyword">this</span><span class="token punctuation">.</span>distY <span class="token operator">+=</span> deltaY
        <span class="token keyword">let</span> absDistX <span class="token operator">=</span> Math<span class="token punctuation">.</span><span class="token function">abs</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">.</span>distX<span class="token punctuation">)</span>
        <span class="token keyword">let</span> absDistY <span class="token operator">=</span> Math<span class="token punctuation">.</span><span class="token function">abs</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">.</span>distY<span class="token punctuation">)</span>
        <span class="token keyword">if</span> <span class="token punctuation">(</span>absDistX <span class="token operator">+</span> directionLockThreshold <span class="token operator">&lt;=</span> absDistY<span class="token punctuation">)</span> <span class="token punctuation">{</span>
          <span class="token keyword">return</span>
        <span class="token punctuation">}</span>
        <span class="token keyword">let</span> timestamp <span class="token operator">=</span> <span class="token function">getNow</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
        <span class="token keyword">if</span> <span class="token punctuation">(</span>timestamp <span class="token operator">-</span> <span class="token keyword">this</span><span class="token punctuation">.</span>endTime <span class="token operator">></span> momentumLimitTime <span class="token operator">&amp;&amp;</span> absDistX <span class="token operator">&lt;</span> momentumLimitDistance<span class="token punctuation">)</span> <span class="token punctuation">{</span>
          <span class="token keyword">return</span>
        <span class="token punctuation">}</span>
        <span class="token keyword">this</span><span class="token punctuation">.</span>movingDirectionX <span class="token operator">=</span> deltaX <span class="token operator">></span> <span class="token number">0</span> <span class="token operator">?</span> <span class="token constant">DIRECTION_RIGHT</span> <span class="token punctuation">:</span> deltaX <span class="token operator">&lt;</span> <span class="token number">0</span> <span class="token operator">?</span> <span class="token constant">DIRECTION_LEFT</span> <span class="token punctuation">:</span> <span class="token number">0</span>
        <span class="token keyword">let</span> newX <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">.</span>x <span class="token operator">+</span> deltaX
        <span class="token keyword">if</span> <span class="token punctuation">(</span>newX <span class="token operator">></span> <span class="token number">0</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
          newX <span class="token operator">=</span> <span class="token number">0</span>
        <span class="token punctuation">}</span>
        <span class="token keyword">if</span> <span class="token punctuation">(</span>newX <span class="token operator">&lt;</span> <span class="token keyword">this</span><span class="token punctuation">.</span>maxScrollX<span class="token punctuation">)</span> <span class="token punctuation">{</span>
          newX <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">.</span>x <span class="token operator">+</span> deltaX <span class="token operator">/</span> <span class="token number">3</span>
        <span class="token punctuation">}</span>
        <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span><span class="token keyword">this</span><span class="token punctuation">.</span>moved<span class="token punctuation">)</span> <span class="token punctuation">{</span>
          <span class="token keyword">this</span><span class="token punctuation">.</span>moved <span class="token operator">=</span> <span class="token boolean">true</span>
        <span class="token punctuation">}</span>
        <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">_translate</span><span class="token punctuation">(</span>newX<span class="token punctuation">,</span> <span class="token boolean">true</span><span class="token punctuation">)</span>
        <span class="token keyword">if</span> <span class="token punctuation">(</span>timestamp <span class="token operator">-</span> <span class="token keyword">this</span><span class="token punctuation">.</span>startTime <span class="token operator">></span> momentumLimitTime<span class="token punctuation">)</span> <span class="token punctuation">{</span>
          <span class="token keyword">this</span><span class="token punctuation">.</span>startTime <span class="token operator">=</span> timestamp
          <span class="token keyword">this</span><span class="token punctuation">.</span>startX <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">.</span>x
        <span class="token punctuation">}</span>
        <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">$emit</span><span class="token punctuation">(</span><span class="token constant">EVENT_SCROLL</span><span class="token punctuation">,</span> <span class="token keyword">this</span><span class="token punctuation">.</span>x<span class="token punctuation">)</span>
      <span class="token punctuation">}</span><span class="token punctuation">,</span>
      <span class="token function">onTouchEnd</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
        <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span><span class="token keyword">this</span><span class="token punctuation">.</span>moved<span class="token punctuation">)</span> <span class="token punctuation">{</span>
          <span class="token keyword">return</span>
        <span class="token punctuation">}</span>
        <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">.</span>movingDirectionX <span class="token operator">===</span> <span class="token constant">DIRECTION_RIGHT</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
          <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">shrink</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
          <span class="token keyword">return</span>
        <span class="token punctuation">}</span>
        <span class="token keyword">this</span><span class="token punctuation">.</span>endTime <span class="token operator">=</span> <span class="token function">getNow</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
        <span class="token keyword">let</span> duration <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">.</span>endTime <span class="token operator">-</span> <span class="token keyword">this</span><span class="token punctuation">.</span>startTime
        <span class="token keyword">let</span> absDistX <span class="token operator">=</span> Math<span class="token punctuation">.</span><span class="token function">abs</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">.</span>x <span class="token operator">-</span> <span class="token keyword">this</span><span class="token punctuation">.</span>startX<span class="token punctuation">)</span>
        <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token punctuation">(</span>duration <span class="token operator">&lt;</span> momentumLimitTime <span class="token operator">&amp;&amp;</span> absDistX <span class="token operator">></span> momentumLimitDistance<span class="token punctuation">)</span> <span class="token operator">||</span> <span class="token keyword">this</span><span class="token punctuation">.</span>x <span class="token operator">&lt;</span> <span class="token keyword">this</span><span class="token punctuation">.</span>maxScrollX <span class="token operator">/</span> <span class="token number">2</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
          <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">grow</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
        <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span>
          <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">shrink</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
        <span class="token punctuation">}</span>
      <span class="token punctuation">}</span><span class="token punctuation">,</span>
      <span class="token function">onTransitionEnd</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
        <span class="token keyword">this</span><span class="token punctuation">.</span>isInTransition <span class="token operator">=</span> <span class="token boolean">false</span>
        <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">_transitionTime</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
        <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">_translate</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">.</span>x<span class="token punctuation">)</span>
      <span class="token punctuation">}</span>
    <span class="token punctuation">}</span><span class="token punctuation">,</span>
    <span class="token function">beforeDestroy</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
      <span class="token keyword">this</span><span class="token punctuation">.</span>swipe<span class="token punctuation">.</span><span class="token function">removeItem</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">)</span>
    <span class="token punctuation">}</span>
  <span class="token punctuation">}</span>
<span class="token operator">&lt;</span><span class="token operator">/</span>script<span class="token operator">></span></code></pre></div>
<p>首先看到inject: [‘swipe’]， 使得父swipe组件实例自身可以通过this.swipe访问到，
接下来看</p>
<div class="gatsby-highlight" data-language="js"><pre class="language-js"><code class="language-js">  props<span class="token punctuation">:</span> <span class="token punctuation">{</span>
      item<span class="token punctuation">:</span> <span class="token punctuation">{</span>
        type<span class="token punctuation">:</span> Object<span class="token punctuation">,</span>
        <span class="token keyword">default</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
          <span class="token keyword">return</span> <span class="token punctuation">{</span><span class="token punctuation">}</span>
        <span class="token punctuation">}</span>
      <span class="token punctuation">}</span><span class="token punctuation">,</span>
      btns<span class="token punctuation">:</span> <span class="token punctuation">{</span>
        type<span class="token punctuation">:</span> Array<span class="token punctuation">,</span>
        <span class="token keyword">default</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
          <span class="token keyword">return</span> <span class="token punctuation">[</span><span class="token punctuation">]</span>
        <span class="token punctuation">}</span>
      <span class="token punctuation">}</span><span class="token punctuation">,</span>
      index<span class="token punctuation">:</span> <span class="token punctuation">{</span>
        type<span class="token punctuation">:</span> Number<span class="token punctuation">,</span>
        index<span class="token punctuation">:</span> <span class="token operator">-</span><span class="token number">1</span>
      <span class="token punctuation">}</span><span class="token punctuation">,</span>
      autoShrink<span class="token punctuation">:</span> <span class="token punctuation">{</span>
        type<span class="token punctuation">:</span> Boolean<span class="token punctuation">,</span>
        <span class="token keyword">default</span><span class="token punctuation">:</span> <span class="token boolean">false</span>
      <span class="token punctuation">}</span>
    <span class="token punctuation">}</span><span class="token punctuation">,</span></code></pre></div>
<p>组件接受四个props，item是在不使用slot自定义子组件元素的情况下使用的，我们可以先不看。
btns就是描述按钮的数组，形如</p>
<div class="gatsby-highlight" data-language="js"><pre class="language-js"><code class="language-js">btns<span class="token punctuation">:</span> <span class="token punctuation">[</span>
            <span class="token punctuation">{</span>
              action<span class="token punctuation">:</span> <span class="token string">'clear'</span><span class="token punctuation">,</span>
              text<span class="token punctuation">:</span> <span class="token string">'不再关注'</span><span class="token punctuation">,</span>
              color<span class="token punctuation">:</span> <span class="token string">'#c8c7cd'</span>
            <span class="token punctuation">}</span><span class="token punctuation">,</span>
            <span class="token punctuation">{</span>
              action<span class="token punctuation">:</span> <span class="token string">'delete'</span><span class="token punctuation">,</span>
              text<span class="token punctuation">:</span> <span class="token string">'删除'</span><span class="token punctuation">,</span>
              color<span class="token punctuation">:</span> <span class="token string">'#ff3a32'</span>
            <span class="token punctuation">}</span>
          <span class="token punctuation">]</span></code></pre></div>
<p>index 接受在外层v-for拿到的index传递给swipe-item组件 便于标识这个swipe-item在swipe容器中的序号。
autoShrink用于当点击滑块的按钮后，是否需要自动收缩滑块，如果使用自定义插槽，则直接给 cube-swipe-item 传递此值即可。</p>
<p>看完了props 我们可以按生命周期流程开始看了，先看created周期</p>
<div class="gatsby-highlight" data-language="js"><pre class="language-js"><code class="language-js">    <span class="token function">created</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
      <span class="token keyword">this</span><span class="token punctuation">.</span>x <span class="token operator">=</span> <span class="token number">0</span>
      <span class="token keyword">this</span><span class="token punctuation">.</span>state <span class="token operator">=</span> <span class="token constant">STATE_SHRINK</span>
      <span class="token keyword">this</span><span class="token punctuation">.</span>swipe<span class="token punctuation">.</span><span class="token function">addItem</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">)</span>
    <span class="token punctuation">}</span><span class="token punctuation">,</span></code></pre></div>
<p>this.x用来记录滑动偏移的量，
this.state用来记录状态，默认是缩起，
this.swipe.addItem(this) 调用父组件的addItem方法把自身实例push到父组件的
this.items数组里收集起来。</p>
<p>初始化完了我们来看</p>
<div class="gatsby-highlight" data-language="js"><pre class="language-js"><code class="language-js"><span class="token function">mounted</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
      <span class="token keyword">this</span><span class="token punctuation">.</span>scrollerStyle <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">.</span>$refs<span class="token punctuation">.</span>swipeItem<span class="token punctuation">.</span>style
      <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">$nextTick</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span>
        <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">refresh</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
      <span class="token punctuation">}</span><span class="token punctuation">)</span>
      <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">$on</span><span class="token punctuation">(</span><span class="token constant">EVENT_SCROLL</span><span class="token punctuation">,</span> <span class="token keyword">this</span><span class="token punctuation">.</span>_handleBtns<span class="token punctuation">)</span>
    <span class="token punctuation">}</span><span class="token punctuation">,</span></code></pre></div>
<p>首先通过把这个组件的dom节点的style用this.scrollerStyle记录起来 便于后续操作
接着调用了this.refresh</p>
<div class="gatsby-highlight" data-language="js"><pre class="language-js"><code class="language-js"><span class="token function">refresh</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
        <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">.</span>btns<span class="token punctuation">.</span>length <span class="token operator">></span> <span class="token number">0</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
          <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">_initCachedBtns</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
          <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">_calculateBtnsWidth</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
        <span class="token punctuation">}</span>
        <span class="token keyword">this</span><span class="token punctuation">.</span>endTime <span class="token operator">=</span> <span class="token number">0</span>
      <span class="token punctuation">}</span><span class="token punctuation">,</span></code></pre></div>
<p>可以看到 我们做了两个初始化工作<em>initCachedBtns和</em>calculateBtnsWidth，并且把endTime标识为0
我们先看_initCachedBtns</p>
<div class="gatsby-highlight" data-language="js"><pre class="language-js"><code class="language-js"><span class="token function">_initCachedBtns</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
        <span class="token keyword">this</span><span class="token punctuation">.</span>cachedBtns <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span>
        <span class="token keyword">const</span> len <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">.</span>$refs<span class="token punctuation">.</span>btns<span class="token punctuation">.</span>length
        <span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">let</span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator">&lt;</span> len<span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
          <span class="token keyword">this</span><span class="token punctuation">.</span>cachedBtns<span class="token punctuation">.</span><span class="token function">push</span><span class="token punctuation">(</span><span class="token punctuation">{</span>
            width<span class="token punctuation">:</span> <span class="token function">getRect</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">.</span>$refs<span class="token punctuation">.</span>btns<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">.</span>width
          <span class="token punctuation">}</span><span class="token punctuation">)</span>
        <span class="token punctuation">}</span>
      <span class="token punctuation">}</span><span class="token punctuation">,</span></code></pre></div>
<p>this.cachedBtns记录按钮宽度大小，
最后生成形如[ {width: 50}, {width: 50 } ] 这样的记录，
再来看_calculateBtnsWidth</p>
<div class="gatsby-highlight" data-language="js"><pre class="language-js"><code class="language-js"><span class="token function">_calculateBtnsWidth</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
        <span class="token keyword">let</span> width <span class="token operator">=</span> <span class="token number">0</span>
        <span class="token keyword">const</span> len <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">.</span>cachedBtns<span class="token punctuation">.</span>length
        <span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">let</span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator">&lt;</span> len<span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
          width <span class="token operator">+=</span> <span class="token keyword">this</span><span class="token punctuation">.</span>cachedBtns<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span>width
        <span class="token punctuation">}</span>
        <span class="token keyword">this</span><span class="token punctuation">.</span>maxScrollX <span class="token operator">=</span> <span class="token operator">-</span>width
      <span class="token punctuation">}</span><span class="token punctuation">,</span></code></pre></div>
<p>其实就是计算出按钮的总长度
然后记录在this.maxScrollX变量上，用于标识向左滑动的最大距离。</p>
<p>mounted的最后this.$on(EVENT<em>SCROLL, this.</em>handleBtns)
注册了EVENT<em>SCROLL事件的回调函数为 this.</em>handleBtns， 我们先记下来 等到触发的时候再详细去讲。</p>
<p>初始化的流程到这就结束了， 那么接下来我们就可以看这个组件的核心 touch事件了，touch事件全部注册在最外层的dom节点上</p>
<div class="gatsby-highlight" data-language="js"><pre class="language-js"><code class="language-js"> <span class="token operator">&lt;</span>div ref<span class="token operator">=</span><span class="token string">"swipeItem"</span>
       @transitionend<span class="token operator">=</span><span class="token string">"onTransitionEnd"</span>
       @touchstart<span class="token operator">=</span><span class="token string">"onTouchStart"</span>
       @touchmove<span class="token operator">=</span><span class="token string">"onTouchMove"</span>
       @touchend<span class="token operator">=</span><span class="token string">"onTouchEnd"</span>
       <span class="token keyword">class</span><span class="token operator">=</span><span class="token string">"cube-swipe-item"</span><span class="token operator">></span></code></pre></div>
<p>我们顺着流程onTouchStart - onTouchMove - onTouchEnd - onTransitionEnd一步一步来走。</p>
<div class="gatsby-highlight" data-language="js"><pre class="language-js"><code class="language-js"><span class="token function">onTouchStart</span><span class="token punctuation">(</span>e<span class="token punctuation">)</span> <span class="token punctuation">{</span>
        <span class="token keyword">this</span><span class="token punctuation">.</span>swipe<span class="token punctuation">.</span><span class="token function">onItemActive</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">.</span>index<span class="token punctuation">)</span>
        <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">$emit</span><span class="token punctuation">(</span><span class="token constant">EVENT_ACTIVE</span><span class="token punctuation">,</span> <span class="token keyword">this</span><span class="token punctuation">.</span>index<span class="token punctuation">)</span>
        <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">stop</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
        <span class="token keyword">this</span><span class="token punctuation">.</span>moved <span class="token operator">=</span> <span class="token boolean">false</span>
        <span class="token keyword">this</span><span class="token punctuation">.</span>movingDirectionX <span class="token operator">=</span> <span class="token number">0</span>
        <span class="token keyword">const</span> point <span class="token operator">=</span> e<span class="token punctuation">.</span>touches<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span>
        <span class="token keyword">this</span><span class="token punctuation">.</span>pointX <span class="token operator">=</span> point<span class="token punctuation">.</span>pageX
        <span class="token keyword">this</span><span class="token punctuation">.</span>pointY <span class="token operator">=</span> point<span class="token punctuation">.</span>pageY
        <span class="token keyword">this</span><span class="token punctuation">.</span>distX <span class="token operator">=</span> <span class="token number">0</span>
        <span class="token keyword">this</span><span class="token punctuation">.</span>distY <span class="token operator">=</span> <span class="token number">0</span>
        <span class="token keyword">this</span><span class="token punctuation">.</span>startX <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">.</span>x
        <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">_transitionTime</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
        <span class="token keyword">this</span><span class="token punctuation">.</span>startTime <span class="token operator">=</span> <span class="token function">getNow</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
        <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">.</span>state <span class="token operator">===</span> <span class="token constant">STATE_GROW</span> <span class="token operator">&amp;&amp;</span> <span class="token operator">!</span><span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">_isInBtns</span><span class="token punctuation">(</span>e<span class="token punctuation">.</span>target<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
          <span class="token keyword">this</span><span class="token punctuation">.</span>shrinkTimer <span class="token operator">=</span> <span class="token function">setTimeout</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span>
            <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">shrink</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
          <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token number">300</span><span class="token punctuation">)</span>
        <span class="token punctuation">}</span>
      <span class="token punctuation">}</span><span class="token punctuation">,</span></code></pre></div>
<p> this.swipe.onItemActive(this.index)
首先通知父组件“我被触摸了”， 这里调用父swipe组件的onItemActive方法</p>
<div class="gatsby-highlight" data-language="js"><pre class="language-js"><code class="language-js"> <span class="token function">onItemActive</span><span class="token punctuation">(</span>index<span class="token punctuation">)</span> <span class="token punctuation">{</span>
        <span class="token keyword">if</span> <span class="token punctuation">(</span>index <span class="token operator">===</span> <span class="token keyword">this</span><span class="token punctuation">.</span>activeIndex<span class="token punctuation">)</span> <span class="token punctuation">{</span>
          <span class="token keyword">return</span>
        <span class="token punctuation">}</span>
        <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">.</span>activeIndex <span class="token operator">!==</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
          <span class="token keyword">const</span> activeItem <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">.</span>items<span class="token punctuation">[</span><span class="token keyword">this</span><span class="token punctuation">.</span>activeIndex<span class="token punctuation">]</span>
          activeItem<span class="token punctuation">.</span><span class="token function">shrink</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
        <span class="token punctuation">}</span>
        <span class="token keyword">this</span><span class="token punctuation">.</span>activeIndex <span class="token operator">=</span> index
      <span class="token punctuation">}</span></code></pre></div>
<p>如果父元素中有已经被触摸左滑展开的swipe-item记录 并且和这个新的swipe-item不是同一个 就通知上一个子组件shrink() 收起， 并且在swipe组件中记录this.activeIndex = index新的子组件序号
this.pointX = point.pageX
this.pointY = point.pageY
this.distX = 0
this.distY = 0
this.startX = this.x
记录了这个点的xy值 把dist当前手指的触碰距离值置为0，把this.x的值赋值给this.startX
调用this._transitionTime()</p>
<div class="gatsby-highlight" data-language="js"><pre class="language-js"><code class="language-js">      <span class="token function">_transitionTime</span><span class="token punctuation">(</span>time <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
        <span class="token keyword">this</span><span class="token punctuation">.</span>scrollerStyle<span class="token punctuation">[</span>transitionDuration<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token template-string"><span class="token string">`</span><span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span>time<span class="token interpolation-punctuation punctuation">}</span></span><span class="token string">ms`</span></span>
      <span class="token punctuation">}</span><span class="token punctuation">,</span></code></pre></div>
<p>把style的transitionDuration置为0 手指触摸的时候不需要transitionDuration来帮我们完成动画过渡效果的，所以先把这个过渡关闭</p>
<div class="gatsby-highlight" data-language="js"><pre class="language-js"><code class="language-js"><span class="token keyword">this</span><span class="token punctuation">.</span>startTime <span class="token operator">=</span> <span class="token function">getNow</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token comment">// 记录触摸开始的时间</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">.</span>state <span class="token operator">===</span> <span class="token constant">STATE_GROW</span> <span class="token operator">&amp;&amp;</span> <span class="token operator">!</span><span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">_isInBtns</span><span class="token punctuation">(</span>e<span class="token punctuation">.</span>target<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
          <span class="token keyword">this</span><span class="token punctuation">.</span>shrinkTimer <span class="token operator">=</span> <span class="token function">setTimeout</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span>
            <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">shrink</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
          <span class="token punctuation">}</span><span class="token punctuation">,</span> <span class="token number">300</span><span class="token punctuation">)</span>
        <span class="token punctuation">}</span></code></pre></div>
<p>这段代码做了一个判断 如果当前的状态是展开 并且点击的位置不在btn内部
就设置了一个定时器 如果touchstart过了300ms 就会把这个swipe-item收起
总结起来就是一系列初始化值的设置，接下来看onTouchMove
onTouchMove的方法比较长 也是滑动动画的核心，我们跟着注释一行一行来解读</p>
<div class="gatsby-highlight" data-language="js"><pre class="language-js"><code class="language-js"><span class="token function">onTouchMove</span><span class="token punctuation">(</span>e<span class="token punctuation">)</span> <span class="token punctuation">{</span>
        <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">.</span>moved<span class="token punctuation">)</span> <span class="token punctuation">{</span>
          <span class="token comment">// 如果moved变量为true 也就是正在移动中， 就把300ms后自动缩进的定时器清空掉</span>
          <span class="token function">clearTimeout</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">.</span>shrinkTimer<span class="token punctuation">)</span>
         <span class="token comment">// 并且阻止事件冒泡</span>
          e<span class="token punctuation">.</span><span class="token function">stopPropagation</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
        <span class="token punctuation">}</span>
        <span class="token comment">/* istanbul ignore if */</span>

       <span class="token comment">// 如果已经在进行动画 就直接return </span>
       <span class="token comment">// 展开动画和缩起动画的过程中这个值都是true</span>
        <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">.</span>isInTransition<span class="token punctuation">)</span> <span class="token punctuation">{</span>
          <span class="token keyword">return</span>
        <span class="token punctuation">}</span>

        <span class="token comment">// 阻止浏览器默认touch行为，比如页面滚动</span>
        e<span class="token punctuation">.</span><span class="token function">preventDefault</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
        <span class="token keyword">const</span> point <span class="token operator">=</span> e<span class="token punctuation">.</span>touches<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span>

        <span class="token comment">// 相对于上次触发touchmove时候横向的偏移量deltaX</span>
        <span class="token keyword">let</span> deltaX <span class="token operator">=</span> point<span class="token punctuation">.</span>pageX <span class="token operator">-</span> <span class="token keyword">this</span><span class="token punctuation">.</span>pointX
        <span class="token comment">// 相对于上次触发touchmove时候竖直方向的偏移量deltaY</span>
        <span class="token keyword">let</span> deltaY <span class="token operator">=</span> point<span class="token punctuation">.</span>pageY <span class="token operator">-</span> <span class="token keyword">this</span><span class="token punctuation">.</span>pointY

        <span class="token comment">// 记录最新的pointX和Y</span>
        <span class="token keyword">this</span><span class="token punctuation">.</span>pointX <span class="token operator">=</span> point<span class="token punctuation">.</span>pageX
        <span class="token keyword">this</span><span class="token punctuation">.</span>pointY <span class="token operator">=</span> point<span class="token punctuation">.</span>pageY

        <span class="token comment">// 本次从touchstart事件开始移动的横向总距离</span>
        <span class="token keyword">this</span><span class="token punctuation">.</span>distX <span class="token operator">+=</span> deltaX

         <span class="token comment">// 本次从touchstart事件开始移动的纵向总距离</span>
        <span class="token keyword">this</span><span class="token punctuation">.</span>distY <span class="token operator">+=</span> deltaY

       <span class="token comment">// distX和distY的绝对值</span>
        <span class="token keyword">let</span> absDistX <span class="token operator">=</span> Math<span class="token punctuation">.</span><span class="token function">abs</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">.</span>distX<span class="token punctuation">)</span>
        <span class="token keyword">let</span> absDistY <span class="token operator">=</span> Math<span class="token punctuation">.</span><span class="token function">abs</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">.</span>distY<span class="token punctuation">)</span>

        <span class="token comment">// 如果横向距离 加directionLockThreshold(被设置成了5) </span>
        <span class="token comment">// 小与纵向移动的距离 就判定成上下滑动 不做任何行为</span>
        <span class="token comment">//这其实就是稍微大于45度角的角度以内的滑动会被识别为侧滑</span>
        <span class="token keyword">if</span> <span class="token punctuation">(</span>absDistX <span class="token operator">+</span> directionLockThreshold <span class="token operator">&lt;=</span> absDistY<span class="token punctuation">)</span> <span class="token punctuation">{</span>
          <span class="token keyword">return</span>
        <span class="token punctuation">}</span>

        <span class="token keyword">let</span> timestamp <span class="token operator">=</span> <span class="token function">getNow</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
        <span class="token comment">// momentumLimitTime和momentumLimitDistance</span>
        <span class="token comment">// 定义两次动画的最小间隔事件和最小间隔移动距离</span>
        <span class="token comment">// 距离上次touchend 300ms内并且 横向移动小于15的move事件会被无视</span>
        <span class="token keyword">if</span> <span class="token punctuation">(</span>timestamp <span class="token operator">-</span> <span class="token keyword">this</span><span class="token punctuation">.</span>endTime <span class="token operator">></span> momentumLimitTime <span class="token operator">&amp;&amp;</span> absDistX <span class="token operator">&lt;</span> momentumLimitDistance<span class="token punctuation">)</span> <span class="token punctuation">{</span>
          <span class="token keyword">return</span>
        <span class="token punctuation">}</span>

        <span class="token comment">// movingDirectionX 滑动的方向， 如果deltaX大于0 则是向右滑动-1 </span>
        <span class="token comment">// 如果deltaX小于0则是左滑-1 如果等于0 则记录为0</span>
        <span class="token keyword">this</span><span class="token punctuation">.</span>movingDirectionX <span class="token operator">=</span> deltaX <span class="token operator">></span> <span class="token number">0</span> <span class="token operator">?</span> <span class="token constant">DIRECTION_RIGHT</span> <span class="token punctuation">:</span> deltaX <span class="token operator">&lt;</span> <span class="token number">0</span> <span class="token operator">?</span> <span class="token constant">DIRECTION_LEFT</span> <span class="token punctuation">:</span> <span class="token number">0</span>
        <span class="token comment">// this.x在执行_translate动画的之后会被更新成当前的translateX值， </span>

       <span class="token comment">// newX拿到了到上次move为止偏移的x值 </span>
       <span class="token comment">// 加上本次move偏移的deltaX值</span>
       <span class="token comment">// 计算出newX也就是下一次应该_translate到x位置值，</span>
       <span class="token comment">// 这个值一定是负数，因为我们的按钮组一定是向左做偏移translateX(-x)</span>
       <span class="token comment">//  当然这个值不能直接交给_translate方法 我们要做一些边界值处理</span>
        <span class="token keyword">let</span> newX <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">.</span>x <span class="token operator">+</span> deltaX
        <span class="token comment">// 不能大于0的边界限制， 保证向右滑动不能超出边缘</span>
        <span class="token keyword">if</span> <span class="token punctuation">(</span>newX <span class="token operator">></span> <span class="token number">0</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
          newX <span class="token operator">=</span> <span class="token number">0</span>
        <span class="token punctuation">}</span>
        <span class="token comment">// 如果X的值比最大的maxScrollX值还小</span>
        <span class="token comment">// maxScrollX的值在refresh中</span>
        <span class="token comment">// 被设置成了按钮组的总width的负值</span>
        <span class="token comment">// 用比较好理解的方法 就是向左拉到了极限值</span>
        <span class="token comment">// 那么你下次再拉30px 只会向左做10px的动画</span>
        <span class="token comment">// 给你一种有阻力的感觉</span>
        <span class="token keyword">if</span> <span class="token punctuation">(</span>newX <span class="token operator">&lt;</span> <span class="token keyword">this</span><span class="token punctuation">.</span>maxScrollX<span class="token punctuation">)</span> <span class="token punctuation">{</span>
          newX <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">.</span>x <span class="token operator">+</span> deltaX <span class="token operator">/</span> <span class="token number">3</span>
        <span class="token punctuation">}</span>

       <span class="token comment">// 如果moved是false 记录为true</span>
        <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span><span class="token keyword">this</span><span class="token punctuation">.</span>moved<span class="token punctuation">)</span> <span class="token punctuation">{</span>
          <span class="token keyword">this</span><span class="token punctuation">.</span>moved <span class="token operator">=</span> <span class="token boolean">true</span>
        <span class="token punctuation">}</span>
       <span class="token comment">// 调用_translate 真正去操作dom左偏移的行为</span>
        <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">_translate</span><span class="token punctuation">(</span>newX<span class="token punctuation">,</span> <span class="token boolean">true</span><span class="token punctuation">)</span>

       <span class="token comment">// 如果这次move的事件减去开始事件小于momentumLimitTime边界值300ms</span>
       <span class="token comment">// 就把这次move手指所在的值定义为下次计算的开始值，好做到手指短暂离开屏幕 动画也可以衔接上</span>
        <span class="token keyword">if</span> <span class="token punctuation">(</span>timestamp <span class="token operator">-</span> <span class="token keyword">this</span><span class="token punctuation">.</span>startTime <span class="token operator">></span> momentumLimitTime<span class="token punctuation">)</span> <span class="token punctuation">{</span>
          <span class="token comment">// 重置startTime为当前时间</span>
          <span class="token keyword">this</span><span class="token punctuation">.</span>startTime <span class="token operator">=</span> timestamp
          <span class="token comment">// 重置startX为当前的偏移值x</span>
          <span class="token keyword">this</span><span class="token punctuation">.</span>startX <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">.</span>x
        <span class="token punctuation">}</span>
        <span class="token comment">// 触发EVENT_SCROLL事件 带出当前的x值。</span>
        <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">$emit</span><span class="token punctuation">(</span><span class="token constant">EVENT_SCROLL</span><span class="token punctuation">,</span> <span class="token keyword">this</span><span class="token punctuation">.</span>x<span class="token punctuation">)</span>
      <span class="token punctuation">}</span><span class="token punctuation">,</span></code></pre></div>
<p>总结touchmove事件 核心就是根据当前手指的x值和start时的x值 调用_translate让dom去做一些偏移</p>
<div class="gatsby-highlight" data-language="js"><pre class="language-js"><code class="language-js">      <span class="token function">_translate</span><span class="token punctuation">(</span>x<span class="token punctuation">,</span> useZ<span class="token punctuation">)</span> <span class="token punctuation">{</span>
        <span class="token keyword">let</span> translateZ <span class="token operator">=</span> useZ <span class="token operator">?</span> <span class="token string">' translateZ(0)'</span> <span class="token punctuation">:</span> <span class="token string">''</span>
        <span class="token keyword">this</span><span class="token punctuation">.</span>scrollerStyle<span class="token punctuation">[</span>transform<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token template-string"><span class="token string">`translate(</span><span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span>x<span class="token interpolation-punctuation punctuation">}</span></span><span class="token string">px,0)</span><span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span>translateZ<span class="token interpolation-punctuation punctuation">}</span></span><span class="token string">`</span></span>
        <span class="token keyword">this</span><span class="token punctuation">.</span>x <span class="token operator">=</span> x
      <span class="token punctuation">}</span><span class="token punctuation">,</span></code></pre></div>
<p><em>translate很简单 把x值写入dom样式里 并且translateZ(0)开启硬件加速
然后更新实例上的this.x 最后还要触发一个EVENT</em>SCROLL
我们在created里看到了这个EVENT<em>SCROLL事件注册的回调是</em>handleBtns
其实就是在touchmove的时候也驱动按钮组做一些动画
_handleBtns</p>
<div class="gatsby-highlight" data-language="js"><pre class="language-js"><code class="language-js">      <span class="token comment">// 根据当前的x值驱动每个按钮去做向左滑动动画</span>
      <span class="token comment">// 并且如果超出了最大x距离 还要让按钮变长</span>
      <span class="token comment">// 让用户有种按钮有弹性拉动的感觉</span>
     <span class="token function">_handleBtns</span><span class="token punctuation">(</span>x<span class="token punctuation">)</span> <span class="token punctuation">{</span>
        <span class="token comment">/* istanbul ignore if */</span>
        <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">.</span>btns<span class="token punctuation">.</span>length <span class="token operator">===</span> <span class="token number">0</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
          <span class="token keyword">return</span>
        <span class="token punctuation">}</span>
        <span class="token keyword">const</span> len <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">.</span>$refs<span class="token punctuation">.</span>btns<span class="token punctuation">.</span>length
        <span class="token keyword">let</span> delta <span class="token operator">=</span> <span class="token number">0</span>
        <span class="token keyword">let</span> totalWidth <span class="token operator">=</span> <span class="token operator">-</span><span class="token keyword">this</span><span class="token punctuation">.</span>maxScrollX
        <span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">let</span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator">&lt;</span> len<span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
          <span class="token keyword">const</span> btn <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">.</span>$refs<span class="token punctuation">.</span>btns<span class="token punctuation">[</span>i<span class="token punctuation">]</span>
          <span class="token keyword">let</span> rate <span class="token operator">=</span> <span class="token punctuation">(</span>totalWidth <span class="token operator">-</span> delta<span class="token punctuation">)</span> <span class="token operator">/</span> totalWidth
          <span class="token keyword">let</span> width
          <span class="token keyword">let</span> translate <span class="token operator">=</span> rate <span class="token operator">*</span> x <span class="token operator">-</span> x
          <span class="token keyword">if</span> <span class="token punctuation">(</span>x <span class="token operator">&lt;</span> <span class="token keyword">this</span><span class="token punctuation">.</span>maxScrollX<span class="token punctuation">)</span> <span class="token punctuation">{</span>
            width <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">.</span>cachedBtns<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span>width <span class="token operator">+</span> rate <span class="token operator">*</span> <span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">.</span>maxScrollX <span class="token operator">-</span> x<span class="token punctuation">)</span>
          <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span>
            width <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">.</span>cachedBtns<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span>width
          <span class="token punctuation">}</span>
          delta <span class="token operator">+=</span> <span class="token keyword">this</span><span class="token punctuation">.</span>cachedBtns<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span>width
          btn<span class="token punctuation">.</span>style<span class="token punctuation">.</span>width <span class="token operator">=</span> <span class="token template-string"><span class="token string">`</span><span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span>width<span class="token interpolation-punctuation punctuation">}</span></span><span class="token string">px`</span></span>
          btn<span class="token punctuation">.</span>style<span class="token punctuation">[</span>transform<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token template-string"><span class="token string">`translate(</span><span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span>translate<span class="token interpolation-punctuation punctuation">}</span></span><span class="token string">px)`</span></span>
          btn<span class="token punctuation">.</span>style<span class="token punctuation">[</span>transitionDuration<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token string">'0ms'</span>
        <span class="token punctuation">}</span>
      <span class="token punctuation">}</span><span class="token punctuation">,</span></code></pre></div>
<div class="gatsby-highlight" data-language="js"><pre class="language-js"><code class="language-js"><span class="token function">onTouchEnd</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
       <span class="token comment">// 如果moved变量为false 什么也不做</span>
        <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span><span class="token keyword">this</span><span class="token punctuation">.</span>moved<span class="token punctuation">)</span> <span class="token punctuation">{</span>
          <span class="token keyword">return</span>
        <span class="token punctuation">}</span>
       
        <span class="token comment">// 如果是向右滑动 调用shrink缩起滑块</span>
        <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">.</span>movingDirectionX <span class="token operator">===</span> <span class="token constant">DIRECTION_RIGHT</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
          <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">shrink</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
          <span class="token keyword">return</span>
        <span class="token punctuation">}</span>
        <span class="token comment">// this.endTime设置为当前时间</span>
        <span class="token keyword">this</span><span class="token punctuation">.</span>endTime <span class="token operator">=</span> <span class="token function">getNow</span><span class="token punctuation">(</span><span class="token punctuation">)</span>

        <span class="token comment">// 从开始滑动到结束的时间间隔</span>
        <span class="token keyword">let</span> duration <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">.</span>endTime <span class="token operator">-</span> <span class="token keyword">this</span><span class="token punctuation">.</span>startTime
        <span class="token comment">// 本次滑动的总距离</span>
        <span class="token keyword">let</span> absDistX <span class="token operator">=</span> Math<span class="token punctuation">.</span><span class="token function">abs</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">.</span>x <span class="token operator">-</span> <span class="token keyword">this</span><span class="token punctuation">.</span>startX<span class="token punctuation">)</span>

        
        <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token punctuation">(</span>duration <span class="token operator">&lt;</span> momentumLimitTime <span class="token operator">&amp;&amp;</span> absDistX <span class="token operator">></span> momentumLimitDistance<span class="token punctuation">)</span> <span class="token operator">||</span> <span class="token keyword">this</span><span class="token punctuation">.</span>x <span class="token operator">&lt;</span> <span class="token keyword">this</span><span class="token punctuation">.</span>maxScrollX <span class="token operator">/</span> <span class="token number">2</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
          <span class="token comment">// 时间间隔&lt;300ms 滑动距离>15 或者滑动距离x比最大滑动距离的一半要小 就展开</span>
          <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">grow</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
        <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span>
          <span class="token comment">//  否则收起</span>
          <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">shrink</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
        <span class="token punctuation">}</span></code></pre></div>
<p>touchend的核心逻辑就是根据记录的一些变量判断是要调用展开还是收起
展开grow</p>
<div class="gatsby-highlight" data-language="js"><pre class="language-js"><code class="language-js">      <span class="token function">grow</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
        <span class="token comment">// 状态记录为展开状态</span>
        <span class="token keyword">this</span><span class="token punctuation">.</span>state <span class="token operator">=</span> <span class="token constant">STATE_GROW</span>
        <span class="token comment">// extend记录为x是否比最大滑动距离要小</span>
        <span class="token keyword">const</span> extend <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">.</span>x <span class="token operator">&lt;</span> <span class="token keyword">this</span><span class="token punctuation">.</span>maxScrollX
        <span class="token comment">// 展开的贝塞尔曲线描述</span>
        <span class="token keyword">let</span> easing <span class="token operator">=</span> easeOutCubic
        <span class="token comment">// 调用scrollTo，值定义为完全展开的x值</span>
        <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">scrollTo</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">.</span>maxScrollX<span class="token punctuation">,</span> easingTime<span class="token punctuation">,</span> easing<span class="token punctuation">)</span>
        <span class="token comment">// 调用_translateBtns让按钮组做动画</span>
        <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">_translateBtns</span><span class="token punctuation">(</span>easingTime<span class="token punctuation">,</span> easing<span class="token punctuation">,</span> extend<span class="token punctuation">)</span>
      <span class="token punctuation">}</span><span class="token punctuation">,</span></code></pre></div>
<p>我们来看看scrollTo方法如何让容器偏移到最大滑动距离</p>
<div class="gatsby-highlight" data-language="js"><pre class="language-js"><code class="language-js">     <span class="token function">scrollTo</span><span class="token punctuation">(</span>x<span class="token punctuation">,</span> time<span class="token punctuation">,</span> easing<span class="token punctuation">)</span> <span class="token punctuation">{</span>
        <span class="token comment">// 设定transform-property为'transform'</span>
        <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">_transitionProperty</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
        <span class="token comment">// 设定transform过渡动画为easing贝塞尔曲线</span>
        <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">_transitionTimingFunction</span><span class="token punctuation">(</span>easing<span class="token punctuation">)</span>
        <span class="token comment">// 设定过渡时间</span>
        <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">_transitionTime</span><span class="token punctuation">(</span>time<span class="token punctuation">)</span>
        <span class="token comment">// 设定transformX值 开始执行动画</span>
        <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">_translate</span><span class="token punctuation">(</span>x<span class="token punctuation">,</span> <span class="token boolean">true</span><span class="token punctuation">)</span>
        <span class="token comment">// 有过渡时间的情况下 把isInTransition变量置为true</span>
        <span class="token keyword">if</span> <span class="token punctuation">(</span>time<span class="token punctuation">)</span> <span class="token punctuation">{</span>
          <span class="token keyword">this</span><span class="token punctuation">.</span>isInTransition <span class="token operator">=</span> <span class="token boolean">true</span>
        <span class="token punctuation">}</span>
      <span class="token punctuation">}</span><span class="token punctuation">,</span></code></pre></div>
<p>其实scrollTo就是给容器设定了一系列的transform的css值，让css帮我们做动画
再看_translateBtns</p>
<div class="gatsby-highlight" data-language="js"><pre class="language-js"><code class="language-js"><span class="token function">_translateBtns</span><span class="token punctuation">(</span>time<span class="token punctuation">,</span> easing<span class="token punctuation">,</span> extend<span class="token punctuation">)</span> <span class="token punctuation">{</span>
        <span class="token comment">/* istanbul ignore if */</span>
        <span class="token comment">// 如果没有btns 就啥也不做</span>
        <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">.</span>btns<span class="token punctuation">.</span>length <span class="token operator">===</span> <span class="token number">0</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
          <span class="token keyword">return</span>
        <span class="token punctuation">}</span>

        <span class="token comment">// 遍历btn组的dom节点，</span>
        <span class="token comment">// 给按钮也设置一系列css transform 让按钮一个个做对应的动画</span>
        <span class="token comment">// 并且如果extend为true 证明此时按钮被拉到超出最大距离 width被变长了</span>
        <span class="token comment">// 要重置为之前的width</span>
        <span class="token keyword">const</span> len <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">.</span>$refs<span class="token punctuation">.</span>btns<span class="token punctuation">.</span>length
        <span class="token keyword">let</span> delta <span class="token operator">=</span> <span class="token number">0</span>
        <span class="token keyword">let</span> translate <span class="token operator">=</span> <span class="token number">0</span>
        <span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">let</span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator">&lt;</span> len<span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
          <span class="token keyword">const</span> btn <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">.</span>$refs<span class="token punctuation">.</span>btns<span class="token punctuation">[</span>i<span class="token punctuation">]</span>
          <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">.</span>state <span class="token operator">===</span> <span class="token constant">STATE_GROW</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
            translate <span class="token operator">=</span> delta
          <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span>
            translate <span class="token operator">=</span> <span class="token number">0</span>
          <span class="token punctuation">}</span>
          delta <span class="token operator">+=</span> <span class="token keyword">this</span><span class="token punctuation">.</span>cachedBtns<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span>width
          btn<span class="token punctuation">.</span>style<span class="token punctuation">[</span>transform<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token template-string"><span class="token string">`translate(</span><span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span>translate<span class="token interpolation-punctuation punctuation">}</span></span><span class="token string">px,0) translateZ(0)`</span></span>
          btn<span class="token punctuation">.</span>style<span class="token punctuation">[</span>transitionProperty<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token string">'all'</span>
          btn<span class="token punctuation">.</span>style<span class="token punctuation">[</span>transitionTimingFunction<span class="token punctuation">]</span> <span class="token operator">=</span> easing
          btn<span class="token punctuation">.</span>style<span class="token punctuation">[</span>transitionDuration<span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token template-string"><span class="token string">`</span><span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span>time<span class="token interpolation-punctuation punctuation">}</span></span><span class="token string">ms`</span></span>
          <span class="token keyword">if</span> <span class="token punctuation">(</span>extend<span class="token punctuation">)</span> <span class="token punctuation">{</span>
            btn<span class="token punctuation">.</span>style<span class="token punctuation">.</span>width <span class="token operator">=</span> <span class="token template-string"><span class="token string">`</span><span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span><span class="token keyword">this</span><span class="token punctuation">.</span>cachedBtns<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">.</span>width<span class="token interpolation-punctuation punctuation">}</span></span><span class="token string">px`</span></span>
          <span class="token punctuation">}</span>
        <span class="token punctuation">}</span>
      <span class="token punctuation">}</span><span class="token punctuation">,</span></code></pre></div>
<p>再来看缩起shrink</p>
<div class="gatsby-highlight" data-language="js"><pre class="language-js"><code class="language-js">      <span class="token function">shrink</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
        <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">stop</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
        <span class="token keyword">this</span><span class="token punctuation">.</span>state <span class="token operator">=</span> <span class="token constant">STATE_SHRINK</span>
        <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">$nextTick</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span>
          <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">scrollTo</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> easingTime<span class="token punctuation">,</span> easeOutQuart<span class="token punctuation">)</span>
          <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">_translateBtns</span><span class="token punctuation">(</span>easingTime<span class="token punctuation">,</span> easeOutQuart<span class="token punctuation">)</span>
        <span class="token punctuation">}</span><span class="token punctuation">)</span>
      <span class="token punctuation">}</span><span class="token punctuation">,</span></code></pre></div>
<p>先调用了stop
stop中先把this.isInTransition置为false
在touchstart时候也会调用stop 所以要根据state判断目标值
如果状态已经是缩起状态STATE<em>SHRINK， 则目标值是0
然后</em>translate过渡到x位置
并且通过EVENT_SCROLL事件通知按钮组也过渡到x位置</p>
<div class="gatsby-highlight" data-language="js"><pre class="language-js"><code class="language-js">      <span class="token function">stop</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
        <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">.</span>isInTransition<span class="token punctuation">)</span> <span class="token punctuation">{</span>
          <span class="token keyword">this</span><span class="token punctuation">.</span>isInTransition <span class="token operator">=</span> <span class="token boolean">false</span>
          <span class="token keyword">let</span> x <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">.</span>state <span class="token operator">===</span> <span class="token constant">STATE_SHRINK</span> <span class="token operator">?</span> <span class="token number">0</span> <span class="token punctuation">:</span> <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">_getComputedPositionX</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
          <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">_translate</span><span class="token punctuation">(</span>x<span class="token punctuation">)</span>
          <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">$emit</span><span class="token punctuation">(</span><span class="token constant">EVENT_SCROLL</span><span class="token punctuation">,</span> <span class="token keyword">this</span><span class="token punctuation">.</span>x<span class="token punctuation">)</span>
        <span class="token punctuation">}</span>
      <span class="token punctuation">}</span><span class="token punctuation">,</span></code></pre></div>
<p>最后在nextTick里调用scrollTo和<em>translateBtns分别把容器dom和按钮组动画移动到缩起状态原位
因为此时state已经是STATE</em>SHRINK了 所以_translateBtns内部会判定x的目标值为0</p>
<p>至此touch事件三剑客都分析完毕了，内部有些细节实现的很精巧
在动画结束的时候会调用onTransitionEnd，做一些状态的重置。</p>
<div class="gatsby-highlight" data-language="js"><pre class="language-js"><code class="language-js">      <span class="token function">onTransitionEnd</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
        <span class="token keyword">this</span><span class="token punctuation">.</span>isInTransition <span class="token operator">=</span> <span class="token boolean">false</span>
        <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">_transitionTime</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
        <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">_translate</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">.</span>x<span class="token punctuation">)</span>
      <span class="token punctuation">}</span></code></pre></div>
<p>另外在按钮上点击会触发clickBtn方法，驱动‘btn-click’事件的触发
并且判断autoShrink的情况下自动收缩起按钮组</p>
<div class="gatsby-highlight" data-language="js"><pre class="language-js"><code class="language-js">      <span class="token function">clickBtn</span><span class="token punctuation">(</span>btn<span class="token punctuation">)</span> <span class="token punctuation">{</span>
        <span class="token keyword">this</span><span class="token punctuation">.</span>swipe<span class="token punctuation">.</span><span class="token function">onBtnClick</span><span class="token punctuation">(</span>btn<span class="token punctuation">,</span> <span class="token keyword">this</span><span class="token punctuation">.</span>index<span class="token punctuation">)</span>
        <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">$emit</span><span class="token punctuation">(</span><span class="token constant">EVENT_BTN_CLICK</span><span class="token punctuation">,</span> btn<span class="token punctuation">,</span> <span class="token keyword">this</span><span class="token punctuation">.</span>index<span class="token punctuation">)</span>
        <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">.</span>autoShrink<span class="token punctuation">)</span> <span class="token punctuation">{</span>
          <span class="token keyword">this</span><span class="token punctuation">.</span><span class="token function">shrink</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
        <span class="token punctuation">}</span>
      <span class="token punctuation">}</span><span class="token punctuation">,</span></code></pre></div></div></article></main><aside><div style="display:flex;margin-bottom:3.5rem"><img src="/static/avatar-a7ffc5973ae4ad272d2060056ad00b21.jpeg" alt="ssh" style="margin-right:0.875rem;margin-bottom:0;width:3.5rem;height:3.5rem;border-radius:50%"/><p style="max-width:310px">ssh 的个人博客，Github: <a href="https://github.com/sl1673495">ssh</a> / 掘金：<a href="https://juejin.im/user/2330620350708823">ssh</a> / 知乎：<a href="https://www.zhihu.com/people/ssh-fe">ssh</a> / 公众号：<a href="https://user-gold-cdn.xitu.io/2020/4/5/17149cbcaa96ff26?imageView2/0/w/1280/h/960/format/webp/ignore-error/1">前端从进阶到入院</a>/ LeetCode：<a href="https://leetcode-cn.com/u/ssh-2/">ssh</a></p></div><nav><ul style="display:flex;flex-wrap:wrap;justify-content:space-between;list-style:none;padding:0"><li><a rel="prev" style="margin-right:20px" href="/378986299/">← <!-- -->Vue源码学习 观察属性watch</a></li><li><a rel="next" href="/383686801/">Vue源码学习 nextTick<!-- --> →</a></li></ul></nav></aside></div></div></div><div id="gatsby-announcer" style="position:absolute;top:0;width:1px;height:1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);white-space:nowrap;border:0" aria-live="assertive" aria-atomic="true"></div></div><script>
  
  
  if(true) {
    (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
    (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
    m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
    })(window,document,'script','https://www.google-analytics.com/analytics.js','ga');
  }
  if (typeof ga === "function") {
    ga('create', 'UA-130227707-1', 'auto', {});
      
      
      
      
      
      }</script><script id="gatsby-script-loader">/*<![CDATA[*/window.pagePath="/381488634/";/*]]>*/</script><script id="gatsby-chunk-mapping">/*<![CDATA[*/window.___chunkMapping={"polyfill":["/polyfill-2e37d876eb976545e777.js"],"app":["/app-0a87eee73eb424d93b37.js"],"component---src-templates-blog-index-js":["/component---src-templates-blog-index-js-ff1a0575dc9337154f98.js"],"component---src-templates-blog-post-js":["/component---src-templates-blog-post-js-37ab84603a0b5df05316.js"]};/*]]>*/</script><script src="/polyfill-2e37d876eb976545e777.js" nomodule=""></script><script src="/webpack-runtime-6ef72c7cd2cbc5f9b7a2.js" async=""></script><script src="/commons-561b408e6df197aa3b5d.js" async=""></script><script src="/app-0a87eee73eb424d93b37.js" async=""></script><script src="/styles-89fd2ae28bdf06750a71.js" async=""></script><script src="/component---src-templates-blog-post-js-37ab84603a0b5df05316.js" async=""></script><script src="/framework-9246dcb394f74450313c.js" async=""></script></body></html>